Лучший способ обновить данные с помощью адаптера RecyclerView [дубликат]



этот вопрос уже есть ответ здесь:



когда я должен использовать классический адаптер с ListView, Я обновляю свои данные в ListView следующим образом:



myAdapter.swapArray(data);

public swapArray(List<Data> data) {
clear();
addAll(data);
notifyDataSetChanged();
}


Я хотел бы знать, что является лучшей практики для RecyclerView. Потому что в RecyclerView адаптер вы не можете сделать clear и addAll а в ListView.



поэтому я попробовал просто с notifyDataSetChanged, но это не сработало.
Затем я попытался с помощью swapAdapter на мой взгляд:



List<Data> data = newData;

MyRecyclerAdapter adapter = new MyRecyclerAdapter(data);

// swapAdapter on my recyclerView (instead of a .setAdapter like with a classic listView).
recyclerViewList.swapAdapter(adapter, false);


но с этим последним решением мне все еще нужно создать новый экземпляр моего адаптера, и я чувствую, что это не лучшее решение. Я должен быть в состоянии просто изменить свои данные без нового MyRecyclerAdapter.

607   4  

4 ответов:

адаптер RecyclerView не поставляется со многими другими методами, доступными в адаптере ListView. Но ваш своп может быть реализован довольно просто, как:

class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
   List<Data> data;
   ...

    public void swap(ArrayList<Data> datas)
    {
        if(datas == null || datas.size()==0)
           return;
        if (data != null && data.size()>0) 
           data.clear();
        data.addAll(datas);
        notifyDataSetChanged();

    }
}

также есть разница между

list.clear();
list.add(data);

и

list = newList;

первый-это повторное использование одного и того же объекта списка. Другой-разыменование и ссылка на список. Старый объект списка, который больше не может быть достигнут, будет собран мусор, но не без предварительного накопления памяти кучи. Это будет то же самое, что инициализация нового адаптера каждый раз, когда вы хотите поменять данные.

@inmyth ответ правильный, просто измените код немного, чтобы обработать пустой список.

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 для извлечения списка, при использовании Onresponse () Retrofit,

adapter.swap(feedList);

DiffUtil может лучший выбор для обновления данных в адаптере RecyclerView, который вы можете найти в рамках android. DiffUtil-это служебный класс, который может вычислять разницу между двумя списками и выводить список операций обновления, который преобразует первый список во второй.

большую часть времени наш список полностью меняется, и мы устанавливаем новый список для адаптера RecyclerView. И мы вызываем notifyDataSetChanged для обновления адаптера. NotifyDataSetChanged быть дорогостоящим. Класс DiffUtil решает эту проблему сейчас. Он делает свою работу отлично!

найдено следующее решение, работающее для моей аналогичной проблемы:

private ExtendedHashMap mData = new ExtendedHashMap();
private  String[] mKeys;

public void setNewData(ExtendedHashMap data) {
    mData.putAll(data);
    mKeys = data.keySet().toArray(new String[data.size()]);
    notifyDataSetChanged();
}

С помощью команды clear-command

mData.clear()

не nessescary

Comments

    Ничего не найдено.