【问题标题】:Recycler View position comparison回收站查看位置对比
【发布时间】:2018-07-19 10:21:29
【问题描述】:

我使用了以下代码。我试图在回收站视图中膨胀多个布局。有了这个我得到了铸造错误,即。无法将 viewholder1 转换为 onBindViewHolder 中的 viewholder(第二个 viewholder)。通过一些调试,我发现 onCreateViewHolder 中 int viewtype 调用的位置与 onBindViewHolder 中的 int 位置不同。你能解释一下区别吗?我能做些什么来纠正我的错误?另外,我不确定我的观察。如果我说错了,请纠正我。

class Adapter_Timeline extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

Vector<TimelineList> vector;
Context mContext;

public Adapter_Timeline(){

}

public Adapter_Timeline(Vector<TimelineList> vector,Context mContext){
        this.vector=vector;
        this.mContext=mContext;
}


@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){

    RecyclerView.ViewHolder viewHolder;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View view;

    if(vector.get(viewType).getType() == 0) {
       view  = inflater.inflate(R.layout.item_timeline_rv, parent, false);
        viewHolder = new VH_Timeline_RV(view);
    }else {
        view = inflater.inflate(R.layout.item_timeline_rv_1, parent, false);
       viewHolder = new VH_Timeline_RV_1(view);
    }


    return viewHolder;

}



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

@Override
public int getItemViewType(int position) {
    if (
            vector.get(position).getType()==0) {

        return 0;

    } else if (vector.get(position).getType()==1) {

        return 1;
    }

    return -1;
}


@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    switch (holder.getItemViewType()) {
        case 0:

            VH_Timeline_RV vh_timeline_rv = (VH_Timeline_RV) holder;
             vh_timeline_rv.simpleDraweeView.setImageURI(vector.get(position).getImage());
            vh_timeline_rv.location.setText(vector.get(position).getLocation());
            vh_timeline_rv.time.setText(vector.get(position).getTime());
            vh_timeline_rv.event.setText(vector.get(position).getName());

            break;

        case 1:
            VH_Timeline_RV_1 vh_timeline_rv_1 = (VH_Timeline_RV_1) holder;
            vh_timeline_rv_1.location.setText(vector.get(position).getLocation());
            vh_timeline_rv_1.time.setText(vector.get(position).getTime());
            vh_timeline_rv_1.event.setText(vector.get(position).getName());
            vh_timeline_rv_1.topic.setText(vector.get(position).getTopic());

            break;
    }

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    类型是从在适配器上覆盖的 getItemViewType 方法返回的,您正在尝试将其用作索引,这就是您想要的:

    if(viewType == 0) {
       view  = inflater.inflate(R.layout.item_timeline_rv, parent, false);
        viewHolder = new VH_Timeline_RV(view);
    } else {
       view = inflater.inflate(R.layout.item_timeline_rv_1, parent, false);
       viewHolder = new VH_Timeline_RV_1(view);
    }
    

    在与 ListViewAdapter 不同的 RecyclerViewAdapter 上,所有视图都在一个方法 (onCreateViewHolder) 上创建,所有数据都在方法 onBindViewHolder(position) 中设置。

    Obs:请不要在命名时加上下划线,静态最终常量除外。

    【讨论】:

      【解决方案2】:

      为什么不直接返回那个位置的类型呢?

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

      然后在你的 onBindViewHolder 中使用实际的方法:

        @Override
          public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
      
              switch (getItemViewType(position)) {
                  ....
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 2023-03-27
        相关资源
        最近更新 更多