Как показать пустой вид при использовании PagedListAdapter с LiveData?

Обычно на RecyclerView я показываю пустой вид, когда на RecyclerView нет элементов, и поскольку я контролирую все обновления RecyclerView с помощью методов notify, то это довольно просто, но с PagedListAdapter обновления, кажется, просто происходят в фоновом режиме, так как Я прячу или показываю свой пустой вид?

Например, если я вызову deleteItem() на моем Room DB, PagedListAdapter будет обновлен сам по себе без моего вызова notifyItemDeleted, но если это был последний элемент в списке, как мой код узнает, что нужно показать пустое представление? Я мог бы запрашивать БД каждый раз, когда происходит действие для подсчета, но это кажется расточительным. Есть ли способ лучше?

Создайте отдельный адаптер для пустых представлений. Самый простой подход... Другие сложны для pagedList

Santanu Sur 30.05.2019 19:34
PagedListAdapter не обновляется самостоятельно. Насколько я знаю, он принимает новый метод PagedList через .submitList(). Поэтому вы можете проверить пустоту в том же LiveData обозревателе, или вы можете переопределить .submitList() метод вашего PagedListAdapter и проверить пустость списка там.
Sanlok Lee 30.05.2019 20:31

@SanlokLee, похоже, вы правы, если вы хотите ответить на него, я с радостью отмечу его как правильный.

casolorz 30.05.2019 21:15

Вы можете обратиться к этому ответу: stackoverflow.com/a/61845719/7438254

Sikander Bakht 17.05.2020 03:14
2
4
2 718
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как упоминалось в комментарии, вы можете проверить пустоту списка в том же обозревателе LiveData, который вы используете для .submitList().

Пример Java:

Я предполагаю, что вы следуете чему-то похожему на этот фрагмент, найденному в документе PagedListAdapter. Я просто добавляю проверку на пустоту в этот пример кода.

class MyActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
        RecyclerView recyclerView = findViewById(R.id.user_list);
        UserAdapter<User> adapter = new UserAdapter();
        viewModel.usersList.observe(this, pagedList -> {
            // Check if the list is empty
            updateView(pagedList.size());
            adapter.submitList(pagedList));

            pagedList.addWeakCallback(null, new PagedList.Callback() {

                @Override
                public void onChanged(int position, int count) {
                    updateView(pagedList.size())
                    // updateView(adapter.getItemCount())
                }

                ...
            }
        }
        recyclerView.setAdapter(adapter);
    }

    private void updateView(int itemCount) {
        if (itemCount > 0) {
            // The list is not empty. Show the recycler view.
            recyclerView.setVisibility(View.VISIBLE);
            emptyView.setVisibility(View.GONE);
        } else {
            // The list is empty. Show the empty list view
            recyclerView.setVisibility(View.GONE);
            emptyView.setVisibility(View.VISIBLE);
        }

    }
}

Пример Котлина:

Приведенный выше пример Java на самом деле является просто Java-переводом примера Kotlin, который я нашел в этом Лаборатория Android-пейджинга.

к сожалению, в моем случае значение pagedList.size() всегда показывает 0. Есть ли способ решить?

Aminul Haque Aome 29.01.2020 04:53

@ Оми Вы правы, что PagedList.size() иногда может быть 0, когда на самом деле есть данные. Позвольте мне исправить ответ, чтобы он мог проверять размер адаптера при обновлении PagedList.

Sanlok Lee 29.01.2020 22:39

Удачи, братан. Надеемся, вы сможете найти именно то решение, которое мы ищем

Aminul Haque Aome 30.01.2020 04:29

Это не лучшее решение, но вы можете попробовать

    myViewModel.getMyPagedList().observe(MainActivity.this, items -> {
        myPagedListAdapter.submitList(items);
        Handler handler = new Handler();
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                if (myPagedListAdapter.getItemCount() == 0) {
                    runOnUiThread(() -> {
                        emptyTextView.setText("Empty");
                        emptyTextView.setVisibility(View.VISIBLE);
                    });
                    // The Runnable will be re-executed (repeated) as long as if condition is true
                    handler.postDelayed(this, 100);
                } else
                    emptyTextView.setVisibility(View.GONE);
            }
        };
        // trigger first time
        handler.postDelayed(runnable, 1000);
    });

Другие вопросы по теме