Использование внешнего ViewBinding в ViewHolder (Android)
Хочется возможно странного: организовать перелистывание статических страниц (отдельные файлы разметки) с помощью ViewPager2, без создания фрагментов. Что-то вроде этого:
class ModbusPageAdapter(private val binding: ViewBinding, private val pages: List<ViewBinding>) : RecyclerView.Adapter<ModbusPageAdapter.ModbusPageHolder>() {
var prevPosition: Int = 0
class ModbusPageHolder(binding: ViewBinding): RecyclerView.ViewHolder(binding.root)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ModbusPageHolder {
return ModbusPageHolder(binding)
}
override fun getItemCount(): Int {
return pages.size
}
override fun onBindViewHolder(holder: ModbusPageHolder, position: Int) {
val page = pages[position]
pages[prevPosition].root.visibility = View.INVISIBLE
page.root.visibility = View.VISIBLE
prevPosition = position
}
}
Т.е. в основном коде создаю основной binding для "контейнера" и список binding-ов для страниц, их передаю в адаптер viewpager-а. Однако это не работает, т.к. holder выбрасывает исключение "ViewHolder views must not be attached when created". Если внутри адаптера использовать не binding, а "надувать" из R.layout, то естественно, объекты внутри viewpager-а и в основном коде будут разными. Так вот: как их всех подружить?
Ответы (1 шт):
Благодаря мастеру woesss удалось разобраться.
Финальный вариант:
class SlidePageAdapter(private val pages: List<ViewBinding>) :
RecyclerView.Adapter<SlidePageAdapter.SlidePageHolder>() {
override fun getItemViewType(position: Int): Int {
return position
}
class SlidePageHolder(binding: ViewBinding) : RecyclerView.ViewHolder(binding.root)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SlidePageHolder {
return SlidePageHolder(pages[viewType])
}
override fun getItemCount(): Int {
return pages.size
}
override fun onBindViewHolder(holder: SlidePageHolder, position: Int) {
}
}
Можно передать список из любого количества биндингов на вьюхи, все работает и не выглядит извращением! Woesss, большое спасибо!