Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RecyclerView和ViewHolder图案-正确的设计方法_Android_Design Patterns_Optimization_Android Recyclerview_Android Viewholder - Fatal编程技术网

Android RecyclerView和ViewHolder图案-正确的设计方法

Android RecyclerView和ViewHolder图案-正确的设计方法,android,design-patterns,optimization,android-recyclerview,android-viewholder,Android,Design Patterns,Optimization,Android Recyclerview,Android Viewholder,我有一个RecyclerView列表,其中的项目视图部分是从.xml文件中的布局创建的(比如头部),部分是基于列表项目以编程方式创建的。我使用了几种不同的itemsviewtype 哪种方法更好 1) 要在适配器中生成视图,请执行以下操作: @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from

我有一个RecyclerView列表,其中的项目视图部分是从.xml文件中的布局创建的(比如头部),部分是基于列表项目以编程方式创建的。我使用了几种不同的itemsviewtype

哪种方法更好

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中生成视图,请执行以下操作:

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

    ... // findViewsById and so on

    createAndAddNewViews();
    createAndAddNewViewsBasedOnSomeParams(param1, param2);

    // both createAndAddNewViews() and   
    // createAndAddNewViewsBasedOnSomeParams() are ViewHolder methods
}
当然,我的例子只是为了说明情况而简化

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

我不知道你认为哪种方法更好,为什么?

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


谢谢

就性能而言,这两种方法都是相同的。如果不同的项目类型具有不同的视图持有者,则可以在视图持有者中在一个位置分离属于某个视图持有者的代码

您的
适配器
应使用
RecyclerView.ViewHolder
作为视图持有者类生成视图。所以,这是你的两个建议的混合。你能证明或展示这种混合应该是什么样的吗?基于:“根视图”在onCreateViewHolder()方法期间膨胀。如果您的
MyViewHolder
类更改为
extends RecyclerView.ViewHolder
,则它是两者的混合体;而不是像在简化案例中那样简单地创建
ViewHolder
,而是分别在
onCreateViewHolder()
onBindViewHolder()中创建和绑定它。