Исходные данные из ListAdapter стираются при использовании DiffUtil.ItemCallback - PullRequest
0 голосов
/ 30 октября 2019

В моем приложении у меня есть два объекта LiveData, один для получения элементов от 0-10 и второй для получения элементов от 11-20. Я пытаюсь загрузить данные в RecyclerView, но вместо 20 элементов первые 10 (0-10) заменяются новыми 10 (11-20). Вот что я пробовал:

recyclerView = findViewById(R.id.recycler_view);
adapter = new ItemsAdapter();
recyclerView.setAdapter(adapter);
viewModel = new ViewModelProvider(this).get(ItemListViewModel.class);

Для получения предметов от 0 до 10 я использую этот метод:

private void getInitialItems() {
    ItemListLiveData liveData = viewModel.getItemsLiveData();
    liveData.observe(this, itemtList -> adapter.submitList(itemtList));
}

Для получения предметов от 11 до 20 я использую этот метод:

private void getNextlItems() {
    ItemListLiveData liveData = viewModel.getItemsLiveData();
    liveData.observe(this, itemtList -> adapter.submitList(itemtList));
}

Это мой класс ViewModel:

public class ItemListViewModel extends ViewModel {
    private ItemListRepository repository = new ItemListRepository();

    ItemListLiveData getItemsLiveData() {
        return repository.getItemListLiveData();
    }
}

В хранилище я получаю элементы только с внутреннего сервера. Это мой класс адаптера:

public class ItemsAdapter extends ListAdapter<Item, ItemsAdapter.ItemViewHolder> {
    ItemsAdapter() {
        super(diffCallback);
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //Inflate the view
    }

    @Override
    public void onBindViewHolder(@NonNull final ItemViewHolder holder, int position) {
        //Bind the Item according to position
    }

    private static DiffUtil.ItemCallback<Item> diffCallback = new DiffUtil.ItemCallback<Item>() {
        @Override
        public boolean areItemsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
            return oldItem.id.equals(newItem.id);
        }

        @Override
        public boolean areContentsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
            return oldItem.equals(newItem);
        }
    };
}

Я ожидаю, что при использовании DiffUtil.ItemCallback получу оба списка в виде накопительного списка, поскольку все объекты различны. Даже если я передам оба списка одному и тому же адаптеру, у меня останется только десять элементов (11-20). Как использовать submit list, чтобы в моем списке было 20 элементов, а не только 10 (11-20)?

1 Ответ

1 голос
/ 30 октября 2019

DiffUtil.ItemCallback используется для плавной анимации изменений в наборе данных в адаптере.

Например, если у вас есть 10 элементов, чем отправить список с 9 элементами, которые содержались в предыдущих 10, DiffUtil.ItemCallback определитразница между старым и новым списком, положение которого и анимация элемента соответственно изменяются. В вашем случае вы ищете Разбиение на страницы , где вы можете развернуть / показать элементы во время прокрутки.

Вам не нужно два LiveData для этого, вы приводите данные выборки изкакой-то источник добавил его к LiveData из Pagination. Сначала будет показано 10 пунктов, затем, если вы прокрутите до конца еще 10, и так далее. Вы можете настроить тип разбивки на страницы в соответствии с вашими потребностями с помощью Configuration.

. Чтобы сделать все это без разбивки на страницы.

    liveData.observe(this, itemtList -> adapter.submitList(adapter.getCurrentList().addAll(itemtList)));

Получить предыдущие данные, поверх этих данных добавить новые данные ивсе будет показано.

...