Предварительная выборка для дочернего представления переработчика не работает - PullRequest
1 голос
/ 02 апреля 2019

У меня вертикальный RecyclerView с дочерним (вложенным) горизонтальным RecyclerView.Для второго переработчика я использую менеджер раскладки:

LinearLayoutManager(itemView.context, LinearLayoutManager.HORIZONTAL, false).apply {
                    isItemPrefetchEnabled = true
                    initialPrefetchItemCount = 4
                }

Но вложенный переработчик создает только первые два видимых элемента.

Полный код:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val recycler = findViewById<RecyclerView>(R.id.recycler)

        recycler.layoutManager = LinearLayoutManager(this)
        recycler.adapter = MainAdapter(buildElements())
    }

    private fun buildElements(): List<Parent> {
        return (0..2).map { pCount -> createParent(pCount) }
    }

    private fun createParent(index: Int): Parent {
        return Parent(text = "$index",
            list = (0..30).map { Child("item $it") }
        )
    }
}

Главный адаптер

class MainAdapter(private val list: List<Parent>) : RecyclerView.Adapter<MainAdapter.CustomHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomHolder {
        val inflater = LayoutInflater.from(parent.context)
        return CustomHolder(inflater.inflate(R.layout.item, parent, false))
    }

    override fun getItemCount(): Int = list.size

    override fun onBindViewHolder(holder: CustomHolder, position: Int) {
        holder.bind(list[position])
    }

    class CustomHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val recycler = itemView.findViewById<RecyclerView>(R.id.recyclerView)
        private val title = itemView.findViewById<TextView>(R.id.title)

        init {
            recycler.layoutManager =
                LinearLayoutManager(itemView.context, LinearLayoutManager.HORIZONTAL, false).apply {
                    isItemPrefetchEnabled = true
                    initialPrefetchItemCount = 4
                }
        }

        fun bind(data: Parent) {
            title.text = data.text
            recycler.adapter = ChildAdapter(data.list)
        }
    }
}

Главный элемент утилизатора

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="wrap_content">

    <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="16dp"/>

    <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_marginTop="16dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
</FrameLayout>

Дочерний адаптер

class ChildAdapter(private val list: List<Child>) : RecyclerView.Adapter<ChildAdapter.ChildHolder>() {

    companion object {
        private val TAG = ChildAdapter::class.java.simpleName
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChildHolder {
        val inflater = LayoutInflater.from(parent.context)
        return ChildHolder(inflater.inflate(R.layout.child, parent, false))
    }

    override fun getItemCount(): Int = list.size

    override fun onBindViewHolder(holder: ChildHolder, position: Int) {
        holder.bind(list[position])
    }

    class ChildHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val title = itemView.findViewById<TextView>(R.id.childText)
        fun bind(data: Child) {
            title.text = data.text
            Log.d(TAG, "bind child element: ${data.text}")
        }
    }
}

И дочерний элемент:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="275dp"
        android:padding="8dp"
        android:layout_height="100dp">

    <TextView
            android:id="@+id/childText"
            android:layout_width="wrap_content"
            android:layout_gravity="center"
            android:layout_height="wrap_content"/>
</FrameLayout>

В логах есть только это:

D/ChildAdapter: bind child element: item 0
D/ChildAdapter: bind child element: item 1
D/ChildAdapter: bind child element: item 0
D/ChildAdapter: bind child element: item 1
D/ChildAdapter: bind child element: item 0
D/ChildAdapter: bind child element: item 1

Журналы означают, что был собран только первый и второй элементы, но я хочу предварительно собрать также третий и четвертый элементы.

Также я пытаюсь использовать this , но этотоже не работает

1 Ответ

0 голосов
/ 03 апреля 2019

предварительная выборка работает только для прокрутки, а не для создания первых начальных элементов.

Наконец-то я использую собственный менеджер макетов с переопределением getExtraLayoutSpace и вернуть 100000. Мое решение потенциально опасно , но я его использую, потому что знаю, что количество предметов не может превышать 10 единиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...