为什么RecyclerView的LinearLayoutManager.findFirstVisibleItemPosition()总是返回0?

4

我想获取RecyclerView的第一个可见项的位置。针对RecyclerView的LayountManager,我正在使用LinearLayoutManager。我使用 LinearLayoutManager.findFirstVisibleItemPosition()来获取RecyclerView的第一个可见项的位置,但它总是返回0。

private lateinit var recyclerView: RecyclerView
private lateinit var progressBar: ProgressBar
private var arrayList:List<ContentWithCategory> = ArrayList()
private lateinit var viewModel: ContentsViewModel
private lateinit var adapter: ContentsAdapter
private lateinit var title:String
private var last_content_id:Int = 0
private var category_id:Int =0

override fun onAttach(context: Context?) {
    super.onAttach(context)
    viewModel= ViewModelProviders.of(this).get(ContentsViewModel::class.java)
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view= inflater.inflate(R.layout.fragment_contents, container, false)
    progressBar=view.findViewById<ProgressBar>(R.id.progressLine)
    recyclerView=view.findViewById<RecyclerView>(R.id.recyclerView)
    recyclerView.setHasFixedSize(true)
    recyclerView.itemAnimator= DefaultItemAnimator()
    viewModel.findContentsByID(category_id).observe(this, Observer<List<ContentWithCategory>>{
        arrayList=it
        adapter=ContentsAdapter(context!!,arrayList,this)
        recyclerView.adapter = adapter
        if(category_id != 0){
            for(i in 0..arrayList.size-1){
                val item = arrayList.get(i)
                if(item.id==last_content_id){
                    (recyclerView.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(i, view.getTop())
                    break
                }
            }
        }
    })
    return view
}

override fun onDestroy() {
    super.onDestroy()
    val position:Int=(recyclerView.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()
    val data=arrayList.get(position)
    last_content_id=data.id
    (ViewModelProviders.of(this).get(CategoryViewModel::class.java)).setHistory(data.id,data.category_id)
}

(recyclerView.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition() 总是返回 0

3个回答

2
在调用super.onDestroy()之前调用它。
结果代码应该是:
override fun onDestroy() {
    val position:Int=(recyclerView.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()
    val data=arrayList.get(position)
    last_content_id=data.id
    (ViewModelProviders.of(this).get(CategoryViewModel::class.java)).setHistory(data.id,data.category_id)
    super.onDestroy()
}

编辑

根据文档

返回第一个可见视图的适配器位置。此位置不包括最后一次布局传递后分派的适配器更改。


谢谢你的回答,我尝试了,但结果还是一样。 - ABDUAHAD
我也尝试在onStop中,结果是一样的。为了测试,我还尝试在onScrollStateChanged(RecyclerView.OnScrollListener())中,结果也是一样的,总是返回0。 - ABDUAHAD
@ABDU,你什么时候将LayoutManager传递给recyclerView? - Rahul Khurana

1
指定适配器。
init {
    setHasStableIds(true)
}

并且

override fun getItemId(position: Int) = position.toLong()

谢谢您的回答,我已经尝试了,但结果仍然相同。 - ABDUAHAD

1
尝试更改onDestroy(),使得在完成保存状态后调用super.onDestroy()。
override fun onDestroy() {
    val position:Int=(recyclerView.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()
    val data=arrayList.get(position)
    last_content_id=data.id 
    (ViewModelProviders.of(this).get(CategoryViewModel::class.java)) .setHistory(data.id,data.category_id)

    super.onDestroy()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接