Обычно на RecyclerView
я показываю пустой вид, когда на RecyclerView
нет элементов, и поскольку я контролирую все обновления RecyclerView
с помощью методов notify
, то это довольно просто, но с PagedListAdapter
обновления, кажется, просто происходят в фоновом режиме, так как Я прячу или показываю свой пустой вид?
Например, если я вызову deleteItem()
на моем Room DB
, PagedListAdapter
будет обновлен сам по себе без моего вызова notifyItemDeleted
, но если это был последний элемент в списке, как мой код узнает, что нужно показать пустое представление? Я мог бы запрашивать БД каждый раз, когда происходит действие для подсчета, но это кажется расточительным. Есть ли способ лучше?
PagedListAdapter
не обновляется самостоятельно. Насколько я знаю, он принимает новый метод PagedList
через .submitList()
. Поэтому вы можете проверить пустоту в том же LiveData
обозревателе, или вы можете переопределить .submitList()
метод вашего PagedListAdapter
и проверить пустость списка там.
@SanlokLee, похоже, вы правы, если вы хотите ответить на него, я с радостью отмечу его как правильный.
Вы можете обратиться к этому ответу: stackoverflow.com/a/61845719/7438254
Как упоминалось в комментарии, вы можете проверить пустоту списка в том же обозревателе 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. Есть ли способ решить?
@ Оми Вы правы, что PagedList.size()
иногда может быть 0, когда на самом деле есть данные. Позвольте мне исправить ответ, чтобы он мог проверять размер адаптера при обновлении PagedList
.
Удачи, братан. Надеемся, вы сможете найти именно то решение, которое мы ищем
Это не лучшее решение, но вы можете попробовать
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);
});
Создайте отдельный адаптер для пустых представлений. Самый простой подход... Другие сложны для
pagedList