将PagedListAdapter与LiveData一起使用时如何显示空白视图?

时间:2019-05-30 17:28:49

标签: android android-room android-livedata

通常在class EditProfileForm(forms.ModelForm): class Meta: model = Profile fields = ('status', 'website', 'description', 'country', 'user', ) 上,当RecyclerView上没有任何项目时,我会显示一个空视图,并且由于我通过RecyclerView方法控制着对RecyclerView的所有更新,因此这非常简单,但是使用notify更新似乎只是在后台进行,所以如何隐藏或显示空视图?

例如,如果我在PagedListAdapter上调用deleteItem(),则Room DB会自动更新,而无需我调用PagedListAdapter,但如果它是最后一项列表中,我的代码如何知道显示空视图?每当计数发生操作时,我都可以查询数据库,但这似乎很浪费。有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

如评论中所述,您可以在用于LiveData的同一.submitList()观察者中测试列表是否为空。

Java示例:

我假设您正在遵循与PagedListAdapter文档中的this snippet类似的内容。我只是在该示例代码中添加了空度检查。

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
            if (pagedList.size() > 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);
            }
            adapter.submitList(pagedList));
        }
        recyclerView.setAdapter(adapter);
    }
}

Kotlin示例:

上面的Java示例实际上只是我在此Android Paging codelab中找到的Kotlin示例的Java翻译。

答案 1 :(得分:0)

这不是最佳解决方案,但是您可以尝试一下

    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);
    });