#android
Вопрос:
У меня есть список новых уведомлений, сохраненных в комнате в ViewModel, у меня есть переменная:
val test = MutableStateFlowlt;Listlt;ItemsResponse.ItemDatagt;gt;(emptyList())
В адаптере у меня есть недоразумение прямо сейчас я пытаюсь также связать его с другой моделью UIModel
override fun onBindViewHolder(holder: NotificationItemViewHolder, position: Int) = with(holder) { bind(item) setOnClickListener { onItemClicked(item.id) } //(item) is on red, error I don't have such variable to use here. } [...] class ItemViewHolder(private val layout: LayoutListItemBinding) : RecyclerView.ViewHolder(layout.root) { fun bind(item: ItemUIModel) = with(layout) { tvName.text = item.Name tvProduct.text = item.product tvSimpleText.text = item.simpleText tvInformation.text = item.information tvTime.text = item.time tvData.text = item.data }
В моем фрагменте я могу получить эти данные, и он зарегистрирует список.
vm.test.collectWith(viewLifecycleOwner){ Log.d("TEST", "test message $it") }
Я только что немного проиграл, не могли бы вы, ребята, помочь мне только с этим делом? Как правильно реализовать onBindViewHolder и как во фрагменте отобразить эти данные в пользовательском интерфейсе?
ИЗМЕНИТЬ: Мой новый адаптер уведомлений
class NotificationAdapter(diffCallback: DiffUtil.ItemCallbacklt;NotificationItemUIModelgt; = NotificationUIItemComparator) : RecyclerView.Adapterlt;NotificationAdapter.NotificationItemViewHoldergt;() { private var onItemClicked: (Int) -gt; Unit = {} var items = emptyListlt;NotificationItemsResponse.NotificationItemDatagt;() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NotificationItemViewHolder { val inflater = LayoutInflater.from(parent.context) return LayoutListItemNotificationBinding.inflate(inflater, parent, false) .let(::NotificationItemViewHolder) setListData(items) } override fun onBindViewHolder(holder: NotificationItemViewHolder, position: Int) = with(holder) { bind(items[position]) //bind(items[position]) error Type mismatch. } class NotificationItemViewHolder(private val layout: LayoutListItemNotificationBinding) : RecyclerView.ViewHolder(layout.root) { fun bind(item: NotificationItemUIModel) = with(layout) { tvName.text = item.Name tvProductNotification.text = item.product tvSimpleText.text = item.simpleText tvInformation.text = item.information tvTime.text = item.time tvData.text = item.data } object NotificationUIItemComparator : DiffUtil.ItemCallbacklt;NotificationItemUIModelgt;() { override fun areItemsTheSame( oldItem: NotificationItemUIModel, newItem: NotificationItemUIModel ) = oldItem.id == newItem.id override fun areContentsTheSame( oldItem: NotificationItemUIModel, newItem: NotificationItemUIModel ) = oldItem == newItem } override fun getItemCount(): Int = items.size fun setListData(list: Listlt;NotificationItemsResponse.NotificationItemDatagt;) { this.items = list notifyDataSetChanged() } }
data class NotificationItemsResponse( val notifications: Listlt;NotificationItemDatagt;, @SerializedName("lastPage") val isLastPage: Boolean ) { @Entity(tableName = "notification_list") data class NotificationItemData( val name: String, val product: String, val data: String, val time: String ){ @PrimaryKey (autoGenerate = true) var id: Int = 0 } }
data class NotificationItemUIModel( val id: Int, val leadFullName: String, val information: String, val product: String, val simpleText: String, val data: String, val time: String )
Ответ №1:
Адаптер
var data = Listlt;ItemsResponse.ItemDatagt; set(value) { field = value notifyDataSetChanged() } override fun onBindViewHolder(holder: NotificationItemViewHolder, position: Int) = with(holder) { bind(data[position]) .... } override fun getItemCount(): Int { return data.size }
фрагмент
vm.test.collectWith(viewLifecycleOwner){ adapter.data = it }
Комментарии:
1. Я не могу использовать: ему нужен вызов функции: Теперь у меня есть мои элементы var = Пустой список NotificationItemDatagt;() onCreateViewHolder { setListData(элементы) } […] забавные setListData(список: Списокgt; NotificationItemDatagt;) { этот.items = список notifyDataSetChanged() } Фрагмент в порядке. Я дам свое главное сообщение с уведомлением об адаптации: ОТРЕДАКТИРУЙТЕ, я не знаю, что (значение) в вашем коде и поле. Это просто: это.предметы = список ?
2. Я не могу понять, что такое данные отображения?
NotificationItemsResponse.NotificationItemData
илиNotificationItemUIModel
3. NotificationItemData, класс данных для комнаты UIModel просто простой класс данных с теми же или похожими значениями, он может быть реализован без этого элемента.
4. отредактируйте свои
NotificationItemViewHolder bind(item : NotificationItemData)
данные, потому что вы хотите отобразить данные notificationitem. UIModel и NotificationItemData не связаны.