ViewModel в RecyclerView

#android #kotlin #android-recyclerview #viewmodel #swiperefreshlayout

#Android #kotlin #android-recyclerview #viewmodel #swiperefreshlayout

Вопрос:

Я использую ViewModel для загрузки данных и установки их в SwipeRefreshLayout RecyclerView

     mAdapter = NewRecyclerViewAdapter(listAct, this@MainActivity, hashMap)
    list?.adapter = mAdapter

     workViewModel.getRequests()?.observe(
                this, Observer { resource ->
                    resource?.data?.let {
                        Log.d(TAG,it.size)
                        mAdapter.setOrders(it)
                    }
                }
            )

  workViewModel = ViewModelProviders.of(
            this,
            ViewModelFactory.getInstance(activity.application)
        ).get(WorkViewModel::class.java)
                   .......


swipe_container.setOnRefreshListener {
            mAdapter.setWorkOrders(listAct)
            mAdapter.notifyDataSetChanged()
        }    
 

Я использую журнал для отладки, он отображает размер 2. Данные, похоже, успешно извлекаются, но для них не установлено значение recyclerView .

Адаптер

  private var order = emptyList<Order>()
     ......
     internal fun setOrders(order: List<Order>) {
            this.order = order
            this.order.sortedBy { it.created_at }
            notifyDataSetChanged()
        }
 

Комментарии:

1. также поместите notifyDataSetChanged() в Oberserver

2. добавлен @HappySingh, результат все тот же

3. в setOrders() вы устанавливаете тот же список заказов. Используйте Orders вместо order

4. @HappySingh допустил там ошибку. Сообщение обновлено.

5. Не могли бы вы опубликовать полный код, чтобы его было легко понять

Ответ №1:

Вы устанавливаете тот же список в своих функциях setOrders () Используйте это вместо своей функции

 internal fun setOrders(orders: List<Order>) {
    this.order = orders.sortedBy { it.created_at }
    notifyDataSetChanged()
}
 

Ответ №2:

Используете ли вы yourRecyclerView.setAdapter(mAdapter ) где-нибудь? Или лучше: вы инициализировали recyclerview и чем настройка адаптера? Если вы используете привязку к данным, проверьте атрибут вашего адаптера в XML-теге recyclerview

Комментарии:

1. да, я это сделал. Находится в этой строке list?.adapter = mAdapter

2. Хорошо, 2 вещи, в вашем RecyclerView проверьте метод getItemCount , он не должен возвращать 0. И другой, пожалуйста, посмотрите LayoutManager для вашего recyclerview: Пример: rv.LayoutManager = LinearLayoutManager (контекст), а затем установите свой адаптер.

3. проверьте высоту и ширину recyclerview

4. и вопрос, почему вы передаете map в начале?

5. Мне нужно использовать эту карту внутри onBindView