0
votes

I have used the following code.i wad trying to inflate multiple layout in recycler view. with this i was getting the casting error ie. viewholder1 cannot be casted to viewholder(second viewholder) in onBindViewHolder. By some debugging i found that the position called by int viewtype in onCreateViewHolder is different from int position in onBindViewHolder. Can you explain the difference and what can i do to correct my error? Also, I'm not sure about my observation. Please correct me if I am wrong telling where is the mistake.

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;
    }
2

2 Answers

0
votes

The type is returned from getItemViewType method overrided at the Adapter, you are trying to use it as a index, this is what you want:

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);
}

On RecyclerViewAdapter different from ListViewAdapter all views are created on one method (onCreateViewHolder) and all data is set in the method onBindViewHolder(position).

Obs: Please dont put Underline on naming except static final constant ones.

0
votes

Why don't you just return the type at that position directly?

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

Then just use the actual method in your onBindViewHolder:

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

        switch (getItemViewType(position)) {
            ....
        }