草庐IT

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

coder 2023-12-29 原文

我有 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 类来比较列表并相应地通知适配器。

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

希望这对您有所帮助。

关于android - 从 LiveData.observe() 添加项目到适配器的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47510010/

有关android - 从 LiveData.observe() 添加项目到适配器的最佳实践的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - capybara field.has_css?匹配器 - 2

    我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No

  6. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  7. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  8. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  9. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  10. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

随机推荐