【问题标题】:RecyclerView and ViewHolder pattern - proper design approachRecyclerView 和 ViewHolder 模式 - 正确的设计方法
【发布时间】:2016-05-07 05:25:49
【问题描述】:

我有 RecyclerView 列表,其中项目视图部分是从 .xml 文件中的布局(比如说标题)创建的,部分是基于列表项以编程方式创建的。我正在使用几个不同的 itemsViewTypes。

哪种方法更好?

1) 在适配器中生成视图:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item, parent, false);
    MyViewHolder holder = new MyViewHolder(view);
    createAndAddNewViews(barsHolder);
    createAndAddNewViewsBasedOnSomeParams(param1, param2);

    // both createAndAddNewViews() and   
    // createAndAddNewViewsBasedOnSomeParams() are Adapter methods

    return holder;
}

2) 在 ViewHolder 中生成 Views:

public MyViewHolder(View itemView) {
    super(itemView);

    ... // findViewsById and so on

    createAndAddNewViews();
    createAndAddNewViewsBasedOnSomeParams(param1, param2);

    // both createAndAddNewViews() and   
    // createAndAddNewViewsBasedOnSomeParams() are ViewHolder methods
}

当然,我的示例只是为了说明情况而进行了简化。

从代码阅读的角度来看,最好在持有者内部拥有视图生成逻辑。每个不同的项目在一个类中都有自己的创建代码。我不必处理适配器中的每一个项目。但我不确定仅从 ViewHolder 模式设计以及内存和速度优化的角度来看是否可以。

我想知道您认为哪种方法更好以及为什么。

编辑:修改视图(onBindViewHolder)和Adapter/ViewHolder中的方法是否同样适用?

谢谢!

【问题讨论】:

  • 您的 Adapter 应该使用 RecyclerView.ViewHolder 生成视图,因为它是 ViewHolder 类。所以,这是你的两个提议的混合体。
  • 您能否详细说明或展示该组合的外观?基于:developer.android.com/training/material/lists-cards.html“根视图”在 onCreateViewHolder() 方法期间被夸大。
  • 如果您的 MyViewHolder 类更改为 extends RecyclerView.ViewHolder 那么它是两者的混合;而不是像在简化案例中那样简单地创建ViewHolder,而是分别在onCreateViewHolder()onBindViewHolder() 中创建和绑定它。

标签: android design-patterns optimization android-recyclerview android-viewholder


【解决方案1】:

在性能方面,这两种方法都是相同的。如果您对不同的 itemTypes 有不同的 ViewHolder,您可以在 ViewHolder 中将属于某个 ViewHolder 的代码隔离在一个地方

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多