RecyclerView创建更多在调用recyclerView.smoothScrollToPosition()时不显示的视图。

时间:2019-01-07 04:05:48

标签: android android-recyclerview

我在Android中使用RecyclerView来显示列表

这是适配器的代码:

class MAdapter(private val context: Context): RecyclerView.Adapter<MViewHolder>() {

    var list = ArrayList<ListItem>()

    override fun onBindViewHolder(holder: MViewHolder, position: Int) {
        Log.e("test", "POSITION "+position)
        val listItem = list[position]
        holder.title.text = listItem.title
        holder.content.text = listItem.content
    }

    override fun getItemCount(): Int {
        return list.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MViewHolder {
        val llView = LayoutInflater.from(context).inflate(R.layout.layout_item_listview, parent, false)
        //
        return MViewHolder(llView)
    }
}

Activity.OnCreate()中:

val adapter = MAdapter(this)
    val list = ArrayList<ListItem>()
    (0..31).mapTo(list) { ListItem("title$it", "content$it") }
    adapter.list = list
    recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
    recyclerView.adapter = adapter
    adapter.notifyDataSetChanged()
    recyclerView.smoothScrollToPosition(0)

在我的屏幕上,它应该显示10个项目。如果我不调用smoothScrollToPositon(),它将仅在RecyclerView.Adapter.onBindViewHolder()中创建10个项目。但是,如果调用smoothScrollToPositon(),则以onBindViewHolder()打印的LOGCAT将打印20项,从0到19,但屏幕始终显示10项(从0到9)。

我感到困惑,为什么会这样?方法smoothScrollToPosition()是否有特殊作用?

2 个答案:

答案 0 :(得分:1)

根据文档:

RecyclerView.LayoutManager,以便能够在布局计算期间批量检测数据集更改。

RecyclerView.LayoutManager负责创建实际的滚动操作。

recyclerview.smoothScrollToPosition(0);-开始平滑滚动到适配器位置。

无论何时调用recyclerview.smoothScrollToPosition(0);,它都会遍历所有数据集并平滑滚动到给定的特定位置。

RecyclerView.LayoutManager仅填充10个项目,因为在smoothScrollToPosition()方法调用期间数据集未更改。

假设用户位于特定位置,并且使用smoothScrollToPosition()方法调用位置0。它将使用onBindViewHolder()方法从用户上一个位置(即用户滚动列表的位置)开始调用的所有数据集。

例如,假设在屏幕上充气4个项目,然后用户最多滚动10个项目。

每次调用smoothScrollToPosition()然后onBindViewHolder()都会调用4次,即位置3到0,因为用户从位置4滚动了列表。

答案 1 :(得分:0)

首先,感谢@GParekar,您的回答向我展示了很多。 我一步一步地浏览RecyclerView中的示例代码,然后在RecyclerView.LayoutManager'getExtraLayoutSpace()'中找到一个关键方法

protected int getExtraLayoutSpace(RecyclerView.State state) {
    if (state.hasTargetScrollPosition()) {
        return mOrientationHelper.getTotalSpace();
    } else {
        return 0;
    }
}

根据文档,此方法返回LayoutManager应该布置的额外空间量。默认情况下,LinearLayoutManager在平滑滚动时会多放置1个项目页面,否则会布局0个项目。

因此,如果未调用方法smoothScrollToPosition(),则默认情况下,方法“ getExtraLayoutSpace()”将返回0。否则,它将返回当前布局的总空间,然后我们将为RecyclerView的项目获得一个双倍空格(2x)。那就是为什么在调用smoothScrollToPosition()之后将'onBindViewHolder'调用2倍的原因。