我想获取RecyclerView第一个可见的项目位置。对于 RecyclerView 的 LayountManager,我使用 LinearLayoutManager。为了获取 RecyclerView 的第一个可见项的位置,我使用 LinearLayoutManager.findFirstVisibleItemPosition() ,但它总是返回 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
最佳答案
在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()
}
编辑
根据文档
Returns the adapter position of the first visible view. This position does not include adapter changes that were dispatched after the last layout pass.
关于android - 为什么RecyclerView的LinearLayoutManager.findFirstVisibleItemPosition()总是返回0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57852613/