Как получить список уведомлений в recyclerview, пользовательский интерфейс?

#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 не связаны.