多个ViewHolder RecycleVIew列表重新排列

时间:2018-06-01 14:12:49

标签: android android-recyclerview recycler-adapter android-viewholder

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

所以我在我的大多数项目中都使用ListView,我认为在Bind ViewHolderRecyclerView之间需要做listview更加灵活1}}。但由于我需要制作水平LayoutManager,因此我可以使用RecyclerView轻松地使用ViewHolders。它完美地运作。

但现在我对RecyclerView使用了多个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(); } } 的不同项目显示不同的视图。它再次使用下面的代码完美地工作。

TYPEB

因此,当我重新排列用于显示项目的列表时,问题就出现了。例如,我从TYPEB列表中的1个项目开始,它显示正确。但是现在我想在列表中添加新项目但是在开始时,以便TYPEA被推回。所以我添加了[TYPEA,TYPEB]的新项目,列表看起来像ViewHolderATYPEA用于ViewHolderBTYPEB用于onBindViewHolder

在这种情况下ViewHolderA viewHolder = (ViewHolderA) holder;

中的行
ViewHolderB

错误地告诉我ViewHolderA无法投放到onBindViewHolder。这显示在重新排列列表后,适配器正在针对ViewHolder调用positon错误的 ` Dim x As Integer Dim test1 As Date Dim schdWS, compWS As Worksheet Const H23M59 As Double = 1 - 60 / 86400 Set schdWS = Sheet1 Set compWS = Sheet11 lastrow = schdWS.Cells(Rows.Count, 8).End(xlUp).Row For x = 20 To lastrow If IsDate(schdWS.Cells(x, 3).Value) Then Cells(x, 3).Value = CDate(Int(Cells(x, 3).Value + H23M59)) End If 'test1.NumberFormat = "dd/mm/yyyy" 'schdWS.Cells(x, 3).FormulaR1C1 = test1 & " 23:59" Next x 实例。知道如何处理这个问题。

1 个答案:

答案 0 :(得分:1)

您需要在此处指定唯一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);
    }
}