#xml #android-layout #kotlin #android-databinding
#xml #android-макет #kotlin #android-привязка к данным
Вопрос:
Я нахожусь в процессе написания абстрактных классов для a ListAdapter
с a SelectionTracker<Long>
. В моем случае элементы SelectionTracker
упорядочиваются по selectionKey
s через
interface TrackedListItem {
var selectionKey : Long?
}
Теперь элементы в RecyclerView
(и, следовательно, элементы, хранящиеся в ListAdapter
), должны привязывать «ViewModel» (обратите внимание, что это не распространяется ViewModel
, я просто следую соглашениям, изложенным в Android Sunflower). Придерживаясь тех же соглашений, my ViewHolder
должен принимать a ViewBinding
в качестве аргумента:
abstract class TrackedItemViewHolder(val binding: ViewBinding) : RecyclerView.ViewHolder(binding.root)
Я заранее знаю, что привязка, переданная в ViewHolder
, имеет переменную данных viewModel
, к которой я могу привязаться, и я буду знать, что это viewModel
реализует TrackedListItem
. Как я могу создать общий макет (и, следовательно, привязку), который эффективно просто проходит:
<data><variable
name="viewModel"
type="...TrackedListItem" /></data>
Ответ №1:
Разумный обходной путь для всех, кто заинтересован, — объявить:
abstract class TrackedItemViewHolder(val binding: ViewBinding) :
RecyclerView.ViewHolder(binding.root){
abstract val viewModel : TrackedListItem
...
а затем в реализациях:
override val viewModel : TrackedListItem
get() = (binding as bindingWithViewModel).viewModel!!