RecyclerView如何处理不同视图的回收?

Tar*_*hra 2 android android-recyclerview

当 RecyclerView 中有异构视图时,它如何处理回收?例如,在下面的代码中,我们创建了 3 种不同类型的视图以在回收器视图中使用。 现在,在这些视图膨胀之后,recyclerView 如何知道不要将这些视图用于位置 1 和 2 的其余项目?

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

private static final int TYPE_1 = 1;
private static final int TYPE_2 = 2;
private static final int TYPE_3 = 3;
// more types...

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    switch (viewType) {
        case TYPE_1: inflate view_type_1
            break;
        case TYPE_2: inflate view_type_2
            break;
        case TYPE_3: inflate view_type_3
            break;
    }
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    switch (getItemViewType(position)) {
        case TYPE_1:
            break;
        case TYPE_2:
            break;
        case TYPE_3:
            break;
    }
}

@Override
public int getItemViewType(int position) {
    if(position == 1) {
        return TYPE_1;
    } else if(position == 2) {
        return TYPE_2;
    } else 
        return TYPE_3
}
}
Run Code Online (Sandbox Code Playgroud)

Gab*_*han 5

RecyclerView 基本上保留了多个 View 对象池,每个池对应 getItemViewType 返回的每个值。当它需要新项目的视图时,它首先调用 getItemViewType。然后,它进入该结果的适当池(如果不存在,则创建一个新池)并从中获取视图。它会记住屏幕上每个视图的类型。当视图循环离开屏幕时,它会返回到正确的池中。