19

Я продлилRecyclerView адаптер notifyDataSetChanged не работает

RecyclerView.Adapter<RecyclerView.ViewHolder> 

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

mRecyclerView.getAdapter().notifyDataSetChanged(); 

Ничего не произошло.

Единственный способ обновить вид, чтобы снова установить адаптер (see this answer):

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

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

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

Любые идеи?

+0

Вы пробовали инкапсулировать notifyDataSetChanged метод в MyAdapter? Например: создать «myNotifyDataSetChanged» в MyAdapter и вызвать этот метод this.notifyDataSetChanged() ». Сохраните ссылку MyAdapter и вызовите myAdapterRef.myNotifyDataSetChanged() вместо myRecyiclerView.getAdapter(). NotifyDataSetChanged().Sont знает, почему это сработало для меня (у меня была эта проблема с ListView) – bajicdusko

+0

@helionprime Не помогло :( – David

+0

ОК, мое плохое. Я забыл получить/использовать обновленные данные в методе 'onBindViewHolder'. blink effect, как я могу избавиться от него? – David

ответ

17

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

4

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

Я использую Дооснащение для извлечения списка, на onResponse ДООСНАСТКЕ (в) использование,

adapter.swap(feedList); 
+0

«Согласно javadocs: Если вы пишете адаптер, всегда будет более эффективно использовать более конкретные события изменений, если вы можете« где в javadocs вы нашли эту информацию? –

+0

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyDataSetChanged() –

13

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

var manager = new LinearLayoutManager(Context, LinearLayoutManager.Vertical, false); 
_list.SetLayoutManager(manager); 

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

Извините за код C#, я использую Xamarin.

0

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

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

 MyAdapter mAdapter = new MyAdapter(...) 

    mRecyclerView.setAdapter(mAdapter); 

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


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

    } 

    } 
-4

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

+0

Это, похоже, не проблема – Gabriel

0

Для обновления recyclerview мы можем сделать следующее:

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(); 
Смежные вопросы