我在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()
是否有特殊作用?
答案 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倍的原因。