从 LiveData.observe() 添加项目到适配器的最佳实践
Best practice for add items to adapter from LiveData.observe()
我有 DAO 方法返回 LiveData<List<Category>>
:
LiveData<List<Category>> listLiveData = categoryDao.getAll();
之后我需要将此数据设置到我的适配器:
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);
}
});
如果数据库中没有数据,我会显示更新按钮(从服务器获取数据并插入数据库)。
如果我有数据,我会创建适配器并为其设置数据。
之后,如果我向数据库中插入一些 Category
,我会得到:
- 触发观察方法并获取所有类别
- 使用此数据创建新适配器
我认为这是非常糟糕的做法(为更新每个项目创建一个新的适配器),我可以通过某种方式:
更改我的适配器并添加方法addData(List<Category> categories);
在 onCreateView 我创建适配器:categoryAdapter = new CategoryAdapter(new ArrayList());
然后当我在 observe
方法中获取数据时,我将其添加到适配器:
adapter.addData(categories);
并在循环中进入 addData
方法检查每个项目,如果不存在则添加到列表并通知数据。
改变方法
LiveData> listLiveData = categoryDao.getAll();
到
LiveData<Category> category = categoryDao.getLast();
并将此项添加到 observe
方法。但是我有两个问题: 1 - 我怎样才能首先添加所有数据?我必须实现 2 种方法 getAll
(调用 wen 创建适配器)和 getLast
(调用数据库中的每个插入)。 2、这个getLast
方法怎么写?
- 你会告诉我正确的方法:)
你的第一步是对的,你应该在Fragment
或Activity
的生命周期中只创建一次适配器并将值(list
)设置为适配器每当您需要更改数据集时。
您应该使用 getAll()
方法,这是最佳做法,因为您在本地数据库中有数据并且不会花费更长的时间。如果你有很长的数据集,那么你应该在有限的地方使用分页。一次获取的项目。这可以在 sqlite 中使用 LIMIT
子句查询来实现。
然后使用notifyDatasetChanged()方法。如果您想为新插入的项目显示流畅的动画,请使用 DiffUtil
class 比较列表并相应地通知适配器。
要了解如何使用 DiffUtil
,请查看 https://medium.com/@iammert/using-diffutil-in-android-recyclerview-bdca8e4fbb00
希望对您有所帮助。
我有 DAO 方法返回 LiveData<List<Category>>
:
LiveData<List<Category>> listLiveData = categoryDao.getAll();
之后我需要将此数据设置到我的适配器:
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);
}
});
如果数据库中没有数据,我会显示更新按钮(从服务器获取数据并插入数据库)。 如果我有数据,我会创建适配器并为其设置数据。
之后,如果我向数据库中插入一些 Category
,我会得到:
- 触发观察方法并获取所有类别
- 使用此数据创建新适配器
我认为这是非常糟糕的做法(为更新每个项目创建一个新的适配器),我可以通过某种方式:
更改我的适配器并添加方法
addData(List<Category> categories);
在 onCreateView 我创建适配器:
categoryAdapter = new CategoryAdapter(new ArrayList());
然后当我在 observe
方法中获取数据时,我将其添加到适配器:
adapter.addData(categories);
并在循环中进入 addData
方法检查每个项目,如果不存在则添加到列表并通知数据。
改变方法
LiveData> listLiveData = categoryDao.getAll();
到
LiveData<Category> category = categoryDao.getLast();
并将此项添加到 observe
方法。但是我有两个问题: 1 - 我怎样才能首先添加所有数据?我必须实现 2 种方法 getAll
(调用 wen 创建适配器)和 getLast
(调用数据库中的每个插入)。 2、这个getLast
方法怎么写?
- 你会告诉我正确的方法:)
你的第一步是对的,你应该在
Fragment
或Activity
的生命周期中只创建一次适配器并将值(list
)设置为适配器每当您需要更改数据集时。您应该使用
getAll()
方法,这是最佳做法,因为您在本地数据库中有数据并且不会花费更长的时间。如果你有很长的数据集,那么你应该在有限的地方使用分页。一次获取的项目。这可以在 sqlite 中使用LIMIT
子句查询来实现。然后使用notifyDatasetChanged()方法。如果您想为新插入的项目显示流畅的动画,请使用
DiffUtil
class 比较列表并相应地通知适配器。
要了解如何使用 DiffUtil
,请查看 https://medium.com/@iammert/using-diffutil-in-android-recyclerview-bdca8e4fbb00
希望对您有所帮助。