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

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

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

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

    在 onCreateView 我创建适配器:categoryAdapter = new CategoryAdapter(new ArrayList());

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

adapter.addData(categories); 

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

  1. 改变方法

    LiveData> listLiveData = categoryDao.getAll();

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

并将此项添加到 observe 方法。但是我有两个问题: 1 - 我怎样才能首先添加所有数据?我必须实现 2 种方法 getAll(调用 wen 创建适配器)和 getLast(调用数据库中的每个插入)。 2、这个getLast方法怎么写?

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

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

  • 然后使用notifyDatasetChanged()方法。如果您想为新插入的项目显示流畅的动画,请使用 DiffUtil class 比较列表并相应地通知适配器。

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

希望对您有所帮助。