重新排列多个ViewHolder RecycleVIew列表

山姆

我试图找到解决方案,但我认为没有人遇到这样的问题。

所以,我一直在使用ListView中我的大部分项目,我觉得这是在不必方面更加灵活的BindViewHolder你需要做的RecyclerView但因为我需要做出一个水平listview,我可以很容易地做到这一点与LayoutManager使用RecyclerView完美运作。

但是现在我使用了多个ViewHoldersRecyclerView因为我需要为的不同项显示不同的视图RecyclerView使用下面的代码,它再次可以完美地工作。

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<Item> data;
    private Context context;

    // Item.Type is an enum, used to differentiate the view types.

    public MyAdapter(List<Item> list, Context context) {
        this.data = list;
        this.context = context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(data.get(viewType).getType() == TYPEA) {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_a, parent, false);
            return new ViewHolderA(itemView);
        }
        else {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_b, parent, false);
            return new ViewHolderB(itemView);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if ( data.get(position).getType()== TYPEA ){
            ViewHolderA viewHolder = (ViewHolderA) holder;
            ...

        }
        else if (data.get(position).getType()== TYPEB){
            ViewHolderB viewHolder = ((ViewHolderB) holder);
            ...            
        }
    }


    @Override
    public int getItemViewType(int position) {        
        return position;
    }


    @Override
    public int getItemCount() {        
        return data.size();
    }

}

因此,当我重新排列用于显示项目的列表时,就会出现问题。例如,我从列表中的1开始TYPEB,它可以正确显示。但是现在我想在列表中添加新项,但要从头开始,因此将TYPEB其推迟。所以我添加了一个新项目,TYPEA列表看起来像[TYPEA,TYPEB]ViewHolderA是为TYPEA并且类似地ViewHolderBTYPEB

在这种情况下,线里面 onBindViewHolder

ViewHolderA viewHolder = (ViewHolderA) holder;

给我抛出一个错误,说ViewHolderB不能转换为ViewHolderA这表明重新排列列表后,适配器针对调用onBindViewHolder了错误的ViewHolder实例positon任何想法如何解决这个问题。

阿列克谢·阿蒂西莫维奇(Alexei Artsimovich)

您需要在此处指定唯一的ID,而不必返回位置:

@Override
public int getItemViewType(int position) {        
    return data.get(position).getType()
}

当然,您必须将viewType参数用作类型而不是位置:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if(viewType == TYPEA) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_a, parent, false);
        return new ViewHolderA(itemView);
    }
    else {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_b, parent, false);
        return new ViewHolderB(itemView);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章