SortedList
обрабатывает связь с адаптером Recycler через Callback
.
Одно различие между SortedList
и List
видно во вспомогательном методе addAll
в примере ниже.
public void addAll(List<Page> items) {
mPages.beginBatchedUpdates();
for (Page item : items) {
mPages.add(item);
}
mPages.endBatchedUpdates();
}
- Сохраняет последний добавленный элемент
Скажем, у меня есть 10 кэшированных элементов для немедленной загрузки, когда мой список ресайклеров заполнен. В то же время я запрашиваю у своей сети те же 10 элементов, потому что они могли измениться с тех пор, как я их кэшировал. Я могу вызвать тот же метод addAll
, и SortedList
заменит cachedItems на fetchedItems под капотом (всегда сохраняет последний добавленный элемент).
// After creating adapter
myAdapter.addAll(cachedItems)
// Network callback
myAdapter.addAll(fetchedItems)
В обычном List
у меня были бы дубликаты всех моих элементов (размер списка 20). С помощью SortedList
он заменяет одинаковые элементы с помощью обратного вызова areItemsTheSame
.
- Это умно о том, когда обновлять Views
При добавлении fetchedItems onChange
будет вызываться только в том случае, если один или несколько заголовков Page
изменились. Вы можете настроить то, что SortedList
ищет в обратном вызове areContentsTheSame
.
- Его исполнитель
Если вы собираетесь добавить несколько элементов в SortedList, вызов BatchedCallback преобразует отдельные вызовы onInserted(index, 1) в один onInserted(index, N), если элементы добавляются в последовательные индексы. Это изменение может помочь RecyclerView гораздо проще разрешать изменения.
Образец
У вас может быть геттер на вашем адаптере для вашего SortedList
, но я просто решил добавить вспомогательные методы в свой адаптер.
Класс адаптера:
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private SortedList<Page> mPages;
public MyAdapter() {
mPages = new SortedList<Page>(Page.class, new SortedList.Callback<Page>() {
@Override
public int compare(Page o1, Page o2) {
return o1.getTitle().compareTo(o2.getTitle());
}
@Override
public void onInserted(int position, int count) {
notifyItemRangeInserted(position, count);
}
@Override
public void onRemoved(int position, int count) {
notifyItemRangeRemoved(position, count);
}
@Override
public void onMoved(int fromPosition, int toPosition) {
notifyItemMoved(fromPosition, toPosition);
}
@Override
public void onChanged(int position, int count) {
notifyItemRangeChanged(position, count);
}
@Override
public boolean areContentsTheSame(Page oldItem, Page newItem) {
// return whether the items' visual representations are the same or not.
return oldItem.getTitle().equals(newItem.getTitle());
}
@Override
public boolean areItemsTheSame(Page item1, Page item2) {
return item1.getId() == item2.getId();
}
});
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.viewholder_page, parent, false);
return new PageViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
PageViewHolder pageViewHolder = (PageViewHolder) holder;
Page page = mPages.get(position);
pageViewHolder.textView.setText(page.getTitle());
}
@Override
public int getItemCount() {
return mPages.size();
}
// region PageList Helpers
public Page get(int position) {
return mPages.get(position);
}
public int add(Page item) {
return mPages.add(item);
}
public int indexOf(Page item) {
return mPages.indexOf(item);
}
public void updateItemAt(int index, Page item) {
mPages.updateItemAt(index, item);
}
public void addAll(List<Page> items) {
mPages.beginBatchedUpdates();
for (Page item : items) {
mPages.add(item);
}
mPages.endBatchedUpdates();
}
public void addAll(Page[] items) {
addAll(Arrays.asList(items));
}
public boolean remove(Page item) {
return mPages.remove(item);
}
public Page removeItemAt(int index) {
return mPages.removeItemAt(index);
}
public void clear() {
mPages.beginBatchedUpdates();
//remove items at end, to avoid unnecessary array shifting
while (mPages.size() > 0) {
mPages.removeItemAt(mPages.size() - 1);
}
mPages.endBatchedUpdates();
}
}
Класс страницы:
public class Page {
private String title;
private long id;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
XML-файл для просмотра:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/text_view"
style="@style/TextStyle.Primary.SingleLine"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Класс просмотра:
public class PageViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
public PageViewHolder(View itemView) {
super(itemView);
textView = (TextView)item.findViewById(R.id.text_view);
}
}
person
Amozoss
schedule
22.04.2015
RecyclerView.Adapter
? Кто-нибудь пишет примеры по этому поводу? - person SilentKnight   schedule 22.04.2015