草庐IT

android - 在 ViewHolder 中绑定(bind)

coder 2023-11-19 原文

这将是理论问题。

作为每个人,我们在应用程序的许多部分使用 RecyclerView。有时 RecyclerView 包含不同的项目,不仅是图像,还有广告、提示等。这就是为什么我们可以在 Adapter 中使用 getViewType() 方法。

但是当我们有很多 viewType 并且在 Adapter 中绑定(bind)它并不优雅时就会出现问题。那么问题来了,在 ViewHolder 中绑定(bind)数据是一种很好的模式吗?

假设我们有应用列表。

为简单起见,每个应用程序都有名称。我们的 ViewHolder 看起来像这样:

class AppViewHolder extends RecyclerView.ViewHolder {

     public TextView nameText;

     AppViewHolder(View itemView) {
          super(itemView)
          nameText = (TextView) itemView.findViewById(R.id.text_name);
     }
}

现在我们可以添加绑定(bind)方法:

public void bind(App app) {
     nameText.setText(app.getName());
}

这是好的模式吗?

另一种解决方案是使用 ViewModel。因为我们在 RecyclerView 中有不同的项目,我们的适配器可以包含类列表,它是每个 ViewModel 的基类。

所以基础类是:

class RecyclerViewItem {}

现在是 App 的 ViewModel 类。

class AppRecyclerViewItem extends RecyclerViewItem {

     App app;

     ...
}

我们的适配器只有 RecyclerViewItems 列表:

class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    List<RecyclerViewItem> items;

    ...
}

那么使用这种方法(我的意思是使用 ViewModel)是在 ViewHolder 中还是在 ViewModel 中添加绑定(bind)方法更好?

最佳答案

我会说你们的解决方案都不好。 第一个只适用于在适配器中只出现一次的项目。创建一个方法来填充 ViewHolder 中的行并不是一个好的解决方案,因为不同类型的 ViewHolders 会增长并且您的 RecyclerView.Adapter 会获得更多并且更多行。

第二种方法也不行。模型就是模型,应该只包含数据而不是应用程序的业务逻辑。

我会建议一个解决方案来保持 RecyclerView.Adapter 干净,并传递创建 ViewHolder 的逻辑并将数据填充给委托(delegate),这将在 ie 中注册。 RecyclerView.Adapter 构造函数。 更多解释此技术here

这样,即使在多个不同的 ViewHolder 上注册也不会专门向 RecyclerView.Adapter 添加样板,而是委托(delegate)创建和填充 RecyclerView 的逻辑.Adapter 行到这些代表。

但这只是一个建议。

关于android - 在 ViewHolder 中绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39946381/

有关android - 在 ViewHolder 中绑定(bind)的更多相关文章

  1. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  2. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. ruby - ruby 中绑定(bind)对象的实际使用 - 2

    昨晚,我在思考我认为是高级ruby​​语言的功能,即Continuations(callcc)和Bindingobjects。我的意思是高级,因为我有静态类型的oo语言背景(C#、Java、C++),我最近才发现ruby​​,所以这些语言特性对我来说不是很熟悉。我想知道这些语言功能在现实世界中的用途是什么。根据我的经验,一切都可以用静态类型的oo语言来完成,但有时我不太同意。我想我在阅读SamRuby的那篇好文章时发现了Continuation的美妙之处/兴趣:http://www.intertwingly.net/blog/2005/04/13/Continuations-for-C

  5. ruby - svn ruby​​ 绑定(bind)是否作为 gem 提供? - 2

    我看到有几十个与svn相关的gem,但是我在其中任何一个上找到的少量文档表明它们是命令行包装器和杂项帮助程序。(svn命令、svn钩子(Hook)等)我在野外看到过执行以下操作的代码:require'svn/core'和SVN.Repos.add(...),但该模块的作者通过apt-get提取了他的svnruby​​工具。这对我来说不是一个选择,因为我正在开发一个windows/osx工具。Thispage列出了一些项目,但特别是,我需要一些可以访问svn+ssh存储库的东西,而且我没有时间花一半的时间来挖掘文档-十几个项目,试图引导每一个。我在寻找哪个gem?从那里开始,我很乐意挖掘

  6. ruby-on-rails - 如何将 rvm 与 eclipse 的设置绑定(bind) - 2

    我正在为不同的应用程序使用多个ruby​​实例和gemset进行开发。为了在我的ruby​​版本和gemset之间切换,我使用.rvmrc文件。我还使用带有radrails插件的Eclipse作为我的开发工具。有什么方法可以让eclipse使用rvm在不同的gemsets和ruby​​版本之间自动切换? 最佳答案 Gointoyourprojectdirectoryandcreateafilecalled.rvmrccontainingtheline:rvmuseruby-1.8.7-p330@testing--default(or

  7. ruby-on-rails - Rails Controller 操作是否隐式定义事务绑定(bind)? - 2

    给定以下代码:defcreate@something=Something.new(params[:something])thing=@something.thing#anothermodel#modificationofattributesonboth'something'and'thing'omitted#doIneedtowrapitinsideatransactionblock?@something.savething.saveendcreate方法是隐式包装在ActiveRecord事务中,还是需要将其包装到事务block中?如果我确实需要包装它,这是最好的方法吗?

  8. ruby - 我可以在 Ruby 中出现异常时访问绑定(bind)吗 - 2

    假设我有:begin2.timesdoa=11/0endrescueputs$!debuggerend在这个例子中,我想获取a的值。如果a在beginblock中初始化,那么我可以在救援时访问它。但是,在此示例中,a是block本地的。当我救援时,有没有办法在异常时刻获得绑定(bind)? 最佳答案 你不能在doblock中再放一个begin,rescueblock吗? 关于ruby-我可以在Ruby中出现异常时访问绑定(bind)吗,我们在StackOverflow上找到一个类似的问题

  9. ruby - 是否可以为 Ruby 创建 Crystal 绑定(bind)? - 2

    我正在创建一个m3u8用于crystal的生成器/解析器,但我想稍后将其与ruby​​一起使用。这可能/容易做到吗? 最佳答案 是的,您可以使用Crystal创建Ruby扩展。足够bindruby库。有一个有趣的presentationbyAnnaKazakowa关于那个话题。另见:phoffer/crystalized_rubymanastech/crystal_ruby 关于ruby-是否可以为Ruby创建Crystal绑定(bind)?,我们在StackOverflow上找到一个类

  10. ruby - Haskell 通过 FFI 与 Ruby 绑定(bind)? - 2

    由于ruby和Haskell都支持FFI,是否可以通过FFI从ruby​​调用Haskell代码?Ruby中有任何Haskell绑定(bind)吗? 最佳答案 我对这个讨论有点迟了,但我目前正在编写Ruby和Haskell之间的桥梁。它位于http://github.com/mwotton/Hubris-它是在C级别工作的绑定(bind)。不过,仍处于非常早期的开发阶段。 关于ruby-Haskell通过FFI与Ruby绑定(bind)?,我们在StackOverflow上找到一个类似的

随机推荐