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

标签 android kotlin

我想获取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/

相关文章:

java - 在 ActionBarSherlock 的 NavigationTab 示例中使用 fragment

java - 从拦截器 token 撤回http请求无效

java - Kotlin Back-Tick 在方法名称中转义 : How does it work?

android - Android中获取GridView实际列宽

android - 我如何在Android的Text To Speech类中找到印度口音

java - 合并模型元素的 ArrayList 且不重复

android - Koin vs Kodein - 依赖注入(inject)你更喜欢什么? Kotlin

android - 如何从Native Android Activity获取数据到Flutter路由库?

kotlin - 如何在Kotlin中创建回调函数?

Android - 如何将 ListView 项目对齐以左右对齐?