【发布时间】: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