ip6*_*696 5 android android-recyclerview android-livedata
我返回了 DAO 方法LiveData<List<Category>>:
LiveData<List<Category>> listLiveData = categoryDao.getAll();
Run Code Online (Sandbox Code Playgroud)
之后,我需要将此数据设置为我的适配器:
listLiveData.observe(this, categories -> {
if (categories == null || categories.isEmpty()) {
price.setVisibility(View.VISIBLE);
recyclerView.setVisibility(View.INVISIBLE);
} else {
categoryAdapter = new CategoryAdapter(categories);
categoryAdapter.setOnItemClickListener(new ClickHandler());
recyclerView.setAdapter(categoryAdapter);
}
});
Run Code Online (Sandbox Code Playgroud)
如果我在 DB 中没有数据,我会显示更新按钮(从服务器获取数据并插入到 DB)。如果我有数据,我会创建适配器并将数据设置为它。
之后,如果我将一些插入Category到数据库中,我会得到:
我认为这是非常糟糕的做法(创建一个新的适配器来更新每个项目),我可以通过某种方式:
更改我的适配器并添加方法 addData(List<Category> categories);
在 onCreateView 我创建适配器: categoryAdapter = new CategoryAdapter(new ArrayList());
然后当我在observe方法中获取数据时,我将其添加到适配器中:
adapter.addData(categories);
Run Code Online (Sandbox Code Playgroud)
并进入addData循环中的方法检查每个项目,如果不存在则添加到列表并通知数据。
改变方法
LiveData> listLiveData = categoryDao.getAll();
到
LiveData<Category> category = categoryDao.getLast();
Run Code Online (Sandbox Code Playgroud)
并将此项添加到observe方法中。但我有两个问题: 1 - 如何首先添加所有数据?我必须实现 2 个方法getAll(调用 wen create 适配器)和getLast(调用 DB 中的每个插入)。2. 这个getLast方法怎么写?
您的第一步是正确的,您应该在Fragment或的生命周期中仅创建一次适配器,并在需要更改数据集时Activity将 value( ) 设置为适配器。list
您应该使用getAll()方法,这是最佳实践,因为您在本地数据库中有数据并且不需要更长的时间。如果您有很长的数据集,那么您应该在有限的情况下使用分页。一次获取的项目数。LIMIT这可以通过使用sqlite 中的子句查询来实现。
然后使用notifyDatasetChanged()方法。如果您想为新插入的项目显示平滑的动画,请使用DiffUtil类来比较列表并相应地通知适配器。
要了解如何使用DiffUtil,请查看https://medium.com/@iammert/using-diffutil-in-android-recyclerview-bdca8e4fbb00
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
4735 次 |
| 最近记录: |