подписаны в BaseAdapter
Используйте RecyclerView с детализированными * уведомлениями, такими как notifyItemInserted
вместо ListView
Проблема в том, что, когда происходит какая-либо операция обновления / вставки, мы снова получаем весь список
Это вполне ожидаемое поведение как с LiveData<List<T>>
, так и с Flowable<List<T>>
.
заставляет базовый адаптер восстанавливать вид.
Это потому, что вы не используете DiffUtil
или не используете новое дополнение RecyclerView, ListAdapter
(которое обрабатывает различие внутри и автоматически)
предоставить полный список операций удаления.
На самом деле он уже предоставляет весь список (конечно, без удаленных элементов).
Решение со стороны AAC заключается в использовании DataSource.Factory<Integer, T>
вместо Flowable<List<T>>/LiveData<List<T>>
, чтобы вы могли создать LiveData<PagedList<T>>
через LivePagedListBuilder
, который вы можете установить на PagedListAdapter
. Таким образом, он выбирает только заданный размер страницы, а не весь список, и обрабатывает различия.
EDIT:
@Entity(tableName = Task.TABLE_NAME)
public class Task {
public static DiffUtil.ItemCallback<Task> DIFF_CALLBACK = new DiffUtil.ItemCallback<Task>() {
@Override
public boolean areItemsTheSame(@NonNull Task oldItem, @NonNull Task newItem) {
return oldItem.id == newItem.id;
}
@Override
public boolean areContentsTheSame(@NonNull Task oldItem, @NonNull Task newItem) {
return oldItem.equals(newItem);
}
};
public static final String TABLE_NAME = "TASK";
public static final String COLUMN_ID = "task_id";
public static final String COLUMN_TEXT = "task_text";
public static final String COLUMN_DATE = "task_date";
и
@Dao
public interface TaskDao {
@Query("SELECT * FROM " + Task.TABLE_NAME + " ORDER BY " + Task.COLUMN_DATE + " ASC ")
DataSource.Factory<Integer, Task> tasksSortedByDate();
// ...
}
и
public class TaskViewModel
extends ViewModel {
private final TaskDao taskDao;
private LiveData<PagedList<Task>> liveResults;
public TaskViewModel(TaskDao taskDao) {
this.taskDao = taskDao;
liveResults = new LivePagedListBuilder<>(taskDao.tasksSortedByDate(),
new PagedList.Config.Builder() //
.setPageSize(20) //
.setPrefetchDistance(20) //
.setEnablePlaceholders(true) //
.build())
.setInitialLoadKey(0)
.build();
}
public LiveData<PagedList<Task>> getTasks() {
return liveResults;
}
}
и
public class TaskFragment
extends Fragment {
RecyclerView recyclerView;
// ...
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
recyclerView = view.findViewById(R.id.recycler_view);
TaskViewModel viewModel = ViewModelProviders.of(this).get(TaskViewModel.class);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
final TaskAdapter taskAdapter = new TaskAdapter();
recyclerView.setAdapter(taskAdapter);
viewModel.getTasks().observe(this, pagedList -> {
//noinspection Convert2MethodRef
taskAdapter.submitList(pagedList);
});
}
@Override
protected void onDestroyView() {
super.onDestroyView();
viewModel.getTasks().removeObservers(this);
}
}
и
public class TaskAdapter
extends PagedListAdapter<Task, TaskAdapter.ViewHolder> {
public TaskAdapter() {
super(Task.DIFF_CALLBACK);
}