RecyclerView Adapter notifyDataSetChanged не работает

Я продлил

RecyclerView.Adapter<RecyclerView.ViewHolder>

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

mRecyclerView.getAdapter().notifyDataSetChanged();

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

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

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

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

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

Есть идеи?

7 ответов

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

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

C# код, я использую Xamarin.

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

прежде чем позвонить recyclerView.SetAdapter(adapter);

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

Согласно 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);

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

1. Create and set adapter again:

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

2. Clear model list data and then notify:

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

В моем случае ничего, кроме этого, не сработало. Когда пришло время обновить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 не работает без установки новых значений для адаптера.]

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

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

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

Поэтому, пожалуйста, убедитесь, что Adapter, о котором вы уведомляете setDatachange (), должен быть старше. Надеюсь приведенный ниже пример поможет..

     MyAdapter mAdapter = new MyAdapter(...)

    mRecyclerView.setAdapter(mAdapter );

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


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

    }

    }

notifyDataSetChanged() должен вызываться в основном потоке.

Другие вопросы по тегам