Подтвердить что ты не робот

Адаптер RecyclerView notifyDataSetChanged не работает

Я расширил

RecyclerView.Adapter<RecyclerView.ViewHolder>

И когда я позвонил:

mRecyclerView.getAdapter().notifyDataSetChanged();

Ничего не случилось.

Единственный способ обновить представление - снова установить адаптер (см. этот ответ):

mRecyclerView.setAdapter(new MyAdapter(...));

У меня есть два вопроса с этим решением:

  • Я вижу мигание на экране, когда я снова устанавливаю адаптер
  • Список просмотров возвращается в первую позицию.

Любые идеи?

4b9b3361

Ответ 1

Если notifyDataSetChanged() не вызывает обновления представлений, есть вероятность, что вы забыли вызвать SetLayoutManager() для вашего RecyclerView (как я это сделал!). Только не забудьте сделать это: Java code:

LinearLayoutManager layoutManager = new LinearLayoutManager(context ,LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager)

Код С#, я использую Xamarin.

var layoutManager = new LinearLayoutManager(Context, LinearLayoutManager.Vertical, false);
recyclerView.SetLayoutManager(layoutManager);

перед вызовом recyclerView.SetAdapter(adapter);

Ответ 2

Если ваш getItemCount() возвращает 0, то notifyDataSetChanged() ничего не сделает. Убедитесь, что при инициализации адаптера вы передаете действительный набор данных.

Ответ 3

В соответствии с javadocs: Если вы пишете адаптер, всегда будет более эффективно использовать более конкретные события изменений, если сможете. Положитесь на notifyDataSetChanged() в крайнем случае.

public class NewsAdapter extends RecyclerView.Adapter<...> {    

private static List mFeedsList;
...

    public void swap(List list){
    if (mFeedsList != null) {
        mFeedsList.clear();
        mFeedsList.addAll(list);
    }
    else {
        mFeedsList = list;
    }
    notifyDataSetChanged();
}

Я использую Retrofit для извлечения списка, при использовании Retrofit onResponse(),

adapter.swap(feedList);

Ответ 4

Чтобы обновить переработчик, мы можем сделать следующее:

  1. Создайте и настройте адаптер снова:

    adapter=new MyAdapter(...);
    mRecyclerView.setAdapter(adapter);
    
  2. Очистите данные списка моделей и затем сообщите:

    List<YourModel> tempModel=new ArrayList<>(modelList); 
    modelList.clear();   
    modelList.addAll(tempModel); 
    adapter.notifyDataSetChanged();
    

Ответ 5

Хотите поделиться чем-то, я столкнулся с той же проблемой. Но то, что я делал неправильно, было. Я создавал экземпляр адаптера каждый раз, когда был новым, и не делал notifysetDatachange() для этого нового экземпляра, а не более старого.

Итак, убедитесь, что Adapter, которого вы notifysetDatachange(), должен быть старше. Надежда ниже примера помогает..

     MyAdapter mAdapter = new MyAdapter(...)

    mRecyclerView.setAdapter(mAdapter );

// TODO 
mAdapter.modifyData(....);
mAdapter.notifySetDataChange();


    MyAdapter extends baseAdapter {
     MyAdapter () {
    }
    modifyData(String[] listData) {

    }

    }

Ответ 6

Итак, я исправил свою проблему следующим образом: orderList - это список, который я передаю в просмотр. Мы можем просто добавить элемент в позицию в списке, здесь 0 - это 0-я позиция в списке. Затем вызовите adapter.notifyDataSetChanged(). Работает как шарм

1) orderList.add(0, String); 2) orderAdapter.notifyDataSetChanged();

Ответ 7

В моем случае ничего, кроме этого, не получилось. Когда пришло время обновить RecyclerView, я сделал:

array = getNewItems();                    // populates the list with new items
((MyAdapter) mAdapter).setValues(array);  // pass the new list to adapter !!!
mAdapter.notifyDataSetChanged();          // tell the adapter a data set has changed

В MyAdapter я установил сеттер для данных:

public void setValues(List<Item> items){
    this.items = items;
}

Вот оно!

[Обратите внимание, что notifyDataSetChanged не работает без установки новых значений для адаптера.]

Ответ 8

notifyDataSetChanged() sholud вызывается в основном потоке.