Sampel Google untuk aplikasi TODO menggunakan MVVM, penyatuan data, LiveData, dan notifyDataSetChanged(). Saya ingin mengganti ini dengan DiffUtil. Sampel memuat ulang data dalam fungsi fragmen onResume.
Memuat ulang seluruh dataSet dalam fungsi onResume.
@Override
public void onResume() {
super.onResume();
mTasksViewModel.start();
}
<ListView
android:id="@+id/tasks_list"
app:items="@{viewmodel.items}"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
public class TasksAdapter extends BaseAdapter {
private final TasksViewModel mTasksViewModel;
private List<Task> mTasks;
private void setList(List<Task> tasks) {
mTasks = tasks;
notifyDataSetChanged();
}
}
public class TasksListBindings {
@SuppressWarnings("unchecked")
@BindingAdapter("app:items")
public static void setItems(ListView listView, List<Task> items) {
TasksAdapter adapter = (TasksAdapter) listView.getAdapter();
if (adapter != null)
{
adapter.setData(items);
}
}
}
Saya sudah menerapkan DiffUtil sebagai pengganti notifyDataSetChanged seperti ini.
protected void setList(List<Item> tasks) {
Log.d("customeee", "mTasks setList");
final ItemsDiffCallback diffCallback = new ItemsDiffCallback(this.mTasks, tasks);
final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
diffResult.dispatchUpdatesTo(this);
this.mTasks.clear();
this.mTasks.addAll(tasks);
}
Namun yang terjadi adalah apa pun yang saya lakukan, fungsi areContentsTheSame selalu menghasilkan nilai true. Jika saya memaksakan kesalahan, pembaruan berfungsi dengan baik.
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
final Item oldItem = mOldList.get(oldItemPosition);
final Item newItem = mNewList.get(newItemPosition);
Log.d("customeee", oldItem.getNote() + " newItem: "+newItem.getNote());
Log.d("customeee", "New == old? "+mOldList.equals(mNewList));
return oldItem.getNote().equals(newItem.getNote());
}
oldItem.getNote() dan newItem.getNote() keduanya mengembalikan nilai baru. Saya pikir ini ada hubungannya dengan referensi jika objek daftar sebagai Daftar Lama.sama dengan(Daftar Baru).