从LiveData.observe()向适配器添加项目的最佳实践

时间:2017-11-27 11:33:40

标签: android recycler-adapter android-livedata

我有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);
        }
 });

如果我没有DB中的数据,则显示更新按钮(从服务器获取数据并插入到DB)。 如果我有数据,我创建适配器并设置数据。

之后如果我向DB插入一些Category,我得到这个:

  1. 触发观察方法并获取所有类别
  2. 使用此数据创建新适配器
  3. 我认为这是非常糟糕的做法(创建一个新的适配器来更新每个项目)我可以用某种方式:

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

      在onCreateView中

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

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

      adapter.addData(categories); 
      

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

      1. 更改方法

        LiveData&GT; listLiveData = categoryDao.getAll();

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

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

        1. 你会告诉我的正确方法:)

1 个答案:

答案 0 :(得分:3)

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

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

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

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

希望这有帮助。