RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 676444
Accepted
Gaket
Gaket
Asked:2020-06-07 20:18:06 +0000 UTC2020-06-07 20:18:06 +0000 UTC 2020-06-07 20:18:06 +0000 UTC

如何正确使用复杂的 ViewHolder?

  • 772

假设有RecyclerView不同的元素ViewHolder。

一种类型的列表项可以有七个小部件EditText,另一种类型可以有其他组件。每个元素类型都有自己的验证逻辑等。

当然,标准解决方案是将 viewholders 放入单独的类中。然而,适配器将有一堆条件if来决定如何用数据填充视图,为给定类型创建哪个视图,等等。

然后问题出现了,我需要在另一个屏幕上使用具有小验证逻辑的相同元素(假设该字段不应以数字开头并且包含少于 8 个字符)。是的,我可以重用 viewholder,但我仍然需要通过初始化来遍历样板getItemViewType(), onCreateViewHolder()...

组织一堆 Adapter-ViewHolder 的最佳方式是什么?

android
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Barmaley
    2020-06-07T20:40:30Z2020-06-07T20:40:30Z
    1. 从ViewHolder内部和/或匿名类转移到公共类
    2. 使用像ButterKnife这样的注释——它们让生活变得更轻松
    • 3
  2. Best Answer
    Alexandr
    2020-06-08T00:58:50Z2020-06-08T00:58:50Z

    查看http://hannesdorfmann.com/android/adapter-delegates中描述的解决方案。

    那里引入了一个新实体 - AdapterDelegate。如果应用程序中有很多列表,委托允许您卸载适配器和ViewHolder,并使它们尽可能可重用。在这种情况下,ViewHolder没有任何逻辑。EditText它只是对 View 元素(等)的引用的类持有者。在委托中,您可以注入Презентеры,通过它传递用户操作。

    但是,存在列表的一个元素在多个地方被重复使用的情况,并且在这个元素中,例如,执行“like”。注入Презентер不是很方便,因为为了最终执行所需的用户脚本,会出现重复代码和拉取额外的依赖项。因此,可以向这个委托中注入一个特殊的委托,它只UseCase (Interactor)执行用户的场景——按下点赞按钮。

    • 1
  3. Vitaly
    2020-01-24T23:17:21Z2020-01-24T23:17:21Z

    在我的项目中,我使用这个库https://github.com/vivchar/RendererRecyclerViewAdapter

    相当容易使用,支持 DiffUtil、Payloads、Nested RecyclerView...

    如何使用:

    1)为你的模型添加一个接口

    public class YourModel implements ViewModel {
        ...
    }
    

    2) 为 RecyclerView 项目创建布局

    <LinearLayout ... >
        <TextView android:id = "@+id/title" ... />
        <ImageView android:id = "@+id/image" ... />
        <Button android:id = "@+id/button" ... />
        <CustomView android:id = "@+id/custom" ... />
    </LinearLayout>
    

    3)初始化适配器

    mRecyclerViewAdapter = new RendererRecyclerViewAdapter(getContext());
    

    4)为每个模型添加一个渲染器

    mRecyclerViewAdapter.registerRenderer(new ViewBinder<>(
        R.layout.item_layout, //ID лейяута созданного в пункте 2
        YourModel.class, //класс вашей модели
        (model, finder, payloads) -> finder
            .find(R.id.custom, (ViewProvider<CustomView>) customView -> { ... })
            .setBackground(R.id.image, model.getBackground())
            .setText(R.id.text, model.getText())
            .setOnClickListener(R.id.button, v -> { ... })
    ));
    
    mRecyclerViewAdapter.registerRenderer(new ViewBinder<>(
        R.layout.other_item_layout,
        OtherYourModel.class,
        (model, finder, payloads) -> finder 
            //...  
    ));
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5