5

我返回了 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方法中。但我有 2 个问题: 1 - 如何首先添加所有数据?我必须实现 2 个方法getAll(调用 wen 创建适配器)和getLast(调用数据库中的每个插入)。2. 这个getLast方法怎么写?

  1. 你会建议我的正确方法:)
4

1 回答 1

3
  • 您的第一步是正确的,您应该在Fragmentor的生命周期中只创建一次适配器,并在需要更改数据集时Activity将 value( ) 设置为适配器。list

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

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

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

希望这可以帮助。

于 2017-11-27T11:49:59.770 回答