如何获取 RecyclerView 的当前加载 rows/items

How to get the current loaded rows/items of a RecyclerView

我的 RecyclerView 中有一个项目列表,我需要一次获取当前加载的项目(即不是回收的或屏幕外的项目)。

这是可能的适配器

class MyAdapter(list: List<String>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    private var items: List<String> = list

    class MyViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
        val myText = view.findViewById<TextView>(R.id.my_text);
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val listItem: View = LayoutInflater.from(parent.context)
            .inflate(R.layout.list_item, parent, false)
        return MyViewHolder(listItem)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.myText.text = items[position]
    }

    override fun getItemCount() = items.size

}

和 RecyclerView:

recyclerView.apply { 
    layoutManager = LinearLayoutManager(this@MainActivity)
    hasFixedSize()
    adapter = MyAdapter(listOf("a", "b", "c"))  // List is bigger than that
}

我该怎么做?

I'd a case that I needed to ensure how many RecyclerView items are currently loaded in order to control a performance issue; so that created this for someone else was looking for an answer.

您需要跟踪已加载和回收项目的列表:

因此,我们可以创建一个本地列表来跟踪当前加载的项目位置,在 onBindViewHolder() 中添加新位置并在 onViewRecycled()

中删除回收的位置

在下面的代码中,currentLoadedPositions 跟踪加载的位置,您可以创建一个方法 returns 它:

class MyAdapter(list: List<String>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    private var items: List<String> = list

    // Tracking the currently loaded items in the RecyclerView
    private val currentLoadedPositions: ArrayList<Int> = ArrayList()

    fun getLoadedPositions(): ArrayList<Int> {
        return currentLoadedPositions
    }


    class MyViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
        val myText = view.findViewById<TextView>(R.id.my_text)

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val listItem: View = LayoutInflater.from(parent.context)
            .inflate(R.layout.list_item, parent, false)
        return MyViewHolder(listItem)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val item = items[position]
        holder.myText.text = item
        currentLoadedPositions.add(position)
        Log.d("LOG_TAG", "onViewRecycled: $currentLoadedPositions")
    }

    override fun getItemCount() = items.size

    override fun onViewRecycled(holder: MyViewHolder) {
        currentLoadedPositions.remove(Integer.valueOf(holder.adapterPosition));
        Log.d("LOG_TAG", "onViewRecycled: $currentLoadedPositions")
    }
}