从 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,我会得到这个:

  1. 触发观察方法并获取所有类别
  2. 使用此数据创建新适配器

我认为这是非常糟糕的做法(创建一个新的适配器来更新每个项目),我可以以某种方式:

  1. 更改我的适配器并添加方法addData(List<Category> categories);

    在创建视图中,我创建适配器:categoryAdapter = new CategoryAdapter(new ArrayList());

然后当我在observe方法中获取数据时,我将其添加到适配器:

adapter.addData(categories); 

并进入循环addData方法检查每个项目,如果不存在,则添加到列表并通知数据。

  1. 更改方法

    LiveData> listLiveData = categoryDao.getAll();

LiveData<Category> category = categoryDao.getLast();

并将此项添加到observe方法中。但是我有 2 个问题:1 - 如何首先添加所有数据?我必须实现 2 个方法getAll(调用 wen 创建适配器)和getLast(调用 DB 中的每个插入)。2. 如何编写此getLast方法?

  1. 你会建议我的正确方式:)
  • 第一步是正确的,您应该在FragmentActivity的生命周期中只创建一次适配器,并在需要更改数据集时将值(list) 设置为 adapter。

  • 您应该使用getAll()方法,这是最佳做法,因为本地数据库中有数据,并且不会花费更长的时间。如果你有很长的数据集,那么你应该使用分页,只有有限的没有。一次获取的项目。这可以使用 sqlite 中的LIMIT子句查询来实现。

  • 然后使用 notifyDatasetChanged() 方法。如果要为新插入的项目显示平滑动画DiffUtil请使用类来比较列表并相应地通知适配器。

要知道如何使用DiffUtil,请查看此 https://medium.com/@iammert/using-diffutil-in-android-recyclerview-bdca8e4fbb00

希望这有帮助。

最新更新