Сделайте ваш класс расширенным ListAdapter
. Создайте переменную DiffUtil.ItemCallback
. и передать его конструктору суперкласса. Остальные методы будут более или менее похожи по сравнению с использованием RecyclerView.Adapter
.
Вот пример кода:
MessageAdapter. java
public class MessageAdapter extends ListAdapter<Model, MessageAdapter.MessageHolder> {
private static final DiffUtil.ItemCallback<Model> DIFF_CALLBACK = new DiffUtil.ItemCallback<Model>() {
@Override
public boolean areItemsTheSame(@NonNull Model oldItem, @NonNull Model newItem) {
return oldItem.getId() == newItem.getId();
}
@Override
public boolean areContentsTheSame(@NonNull Model oldItem, @NonNull Model newItem) {
return oldItem.getMessage().equals(newItem.getMessage()) &&
oldItem.getSeen().equals(newItem.getSeen()); //and other similar checks
}
};
public MessageAdapter() {
super(DIFF_CALLBACK);
}
@NonNull
@Override
public MessageHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_item, parent, false);
return new MessageHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull MessageHolder holder, int position) {
Message currentMessage = getItem(position);
holder.messageTextview.setText(currentMessage.getMessage());
holder.seenTextview.setText(currentMessage.getSeen());
//further views
}
public Message getMessageAt(int position) {
return getItem(position);
}
class MessageHolder extends RecyclerView.ViewHolder {
private TextView messageTextview;
private TextView seenTextview;
//other views
MessageHolder(@NonNull View itemView) {
super(itemView);
messageTextview = itemView.findViewById(R.id.message_tv);
seenTextview = itemView.findViewById(R.id.seen_tv);
//Register listeners if needed
}
}
}
И, наконец, отправьте свой список, используя объект этого класса адаптера. Например:
MessageAdapter adapter = new MessageAdapter();
//prepare list and submit using
adapter.submitList(list);
areItemsTheSame()
должен реализовывать проверки, чтобы убедиться, что элементы в целом, которые накачаны, одинаковы. Принимая во внимание, что areContentsTheSame()
должен реализовывать проверки, которые гарантируют, что содержимое внутри каждого элемента recyclerview не изменится.
Реализация этого автоматически позаботится обо всех анимациях, поскольку класс DiffUtil позаботится о вычислении разницы между списками, а вы не 'Не нужно хранить ссылку на позицию, в которой объект был изменен.