在RecyclerView.Adapter内部滚动到位置

时间:2018-10-22 13:32:06

标签: java android android-recyclerview kotlin recycler-adapter

在RecyclerView.Adapter类中注册一个单击侦听器后,我必须滚动到X位置!

    class MyAdapter(context: Context, mRV: RecyclerView, mLayoutm: LinearLayoutManager) {
    ...

         override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
              holder.itemView.XY_button.setOnClickListener { // Button inside a cell  

                    mRV.layoutManager.scrollToPosition(x)  // Not work
                    mRV.scrollToPosition(x)      // Not work
                    mLayoutm.scrollToPosition(x) // Not work
                    (context as MyRVClass).mRV.mLayoutm.scrollToPosition(x) // Not work
                    (context as MyRVClass).mRV.scrollToPosition(x) // Not work
                    // it does't work with smoothScrollToPosition() too
              }    
         }
    }

PS:我在swift / iOS中使用委托协议解决了这个问题, 我们在android / Kotlin中有等同的东西吗?

3 个答案:

答案 0 :(得分:1)

在您的活动的班级中创建此方法,其中RecyclerView为:

fun scrollToPosition(position: Int) {
    rv.scrollToPosition(position)
}

rv的ID替换RecyclerView

并在侦听器中添加以下内容:

val myActivity: MainActivity = context as MainActivity
myActivity.scrollToPosition(x)

MainActivity替换为活动名称,并将x替换为要滚动的位置。

答案 1 :(得分:0)

如果您使用的是MVVM体系结构,则可以实现如下所示的内容:

  1. 在ViewModel中,有一个字段来存储要滚动到的位置作为LiveData。
  2. 在保存RecyclerView的“活动/片段”中,观察该字段并在其更改时滚动到其位置。

答案 2 :(得分:0)

参加聚会有点晚,但是我是这样做的(也是RecyclerView.Adapter

class MyAdapter(...){
    private lateinit var mRecyclerView: RecyclerView

    override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
        super.onAttachedToRecyclerView(recyclerView)
        mRecyclerView = recyclerView
    }

    fun scrollToPosition(position: Int){
        mRecyclerView.scrollToPosition(position)
    }
}