Tiny
Tiny

Reputation: 109

Unable to inflate 2 different layouts in RecyclerView

I am newbie to material design. I am trying to implement RecyclerView with two row layouts. My problem is that both the rows are showing the same layout i.e. 'one_fragmnet_recycler'. What I want to do is for row 0, 'one_fragmnet_recycler' must inflate and for row 1-recycler_one_pic_poll must inflate.Can anyone tell me where i am going wrong. My codesa re as follows:

 public class OnefragmentAdapter extends RecyclerView.Adapter<OnefragmentAdapter.PersonViewHolder> {
ArrayList<OneFragmentData>arr_data;
Context context;

public OnefragmentAdapter(ArrayList<OneFragmentData> arr_data) {
    this.arr_data = arr_data;
    //this.context=context;
}

@Override
public int getItemViewType(int position) {
    return super.getItemViewType(position);

}

@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View v;
    Log.i("view type outside",""+viewType);
    PersonViewHolder pvh;
   if(viewType==0) {
       v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.one_fragmnet_recycler, viewGroup, false);

       Log.i("view type inside 0", "" + viewType);



   }
    else  {
       v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_one_pic_poll, viewGroup, false);

       Log.i("view type inside 1", "" + viewType);

   }


    return new PersonViewHolder(v);
}

@Override
public void onBindViewHolder(PersonViewHolder holder, int position) {

}

@Override
public int getItemCount() {
    return /*arr_data.size()*/2;
}

public static class PersonViewHolder extends RecyclerView.ViewHolder {
    CardView card_one;
    ImageView imv_profile_pic, imv_indicator, imv_timer, imv_followers;
    TextView tv_uname, tv_posted_date, tv_desc, tv_followers;

    public PersonViewHolder(View itemView) {
        super(itemView);
        /*card_one=(CardView)itemView.findViewById(R.id.card_one);
        imv_profile_pic=(ImageView)itemView.findViewById(R.id.imv_profile_pic);
        imv_indicator=(ImageView)itemView.findViewById(R.id.imv_indicator);
        imv_timer=(ImageView)itemView.findViewById(R.id.imv_timer);
        imv_followers=(ImageView)itemView.findViewById(R.id.imv_followers);
        tv_uname=(TextView)itemView.findViewById(R.id.tv_uname);
        tv_posted_date=(TextView)itemView.findViewById(R.id.tv_posted_date);
        tv_desc=(TextView)itemView.findViewById(R.id.tv_desc);
        tv_followers=(TextView)itemView.findViewById(R.id.tv_followers);*/
    }
}
}

Upvotes: 0

Views: 389

Answers (2)

Ranjith Kumar
Ranjith Kumar

Reputation: 278

You need to invoke getViewType() method and pass its type

 @Override
 public int getItemViewType(int position) {
 if(pos==0){
 return VIEW_TYPE_0;
 }
 return VIEW_TYPE_1;
 }
 ...

 @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int 
viewType){
  if(viewType== VIEW_TYPE_0){
     return viewHolder;
  }else if(viewType== VIEW_TYPE_1){
return viewHolder;
 }
}

For view holder you need to create two holders, that will inflate two layouts based on position(view type), you pass from getViewType() method. Dont check onBindViewHolder() view type here because, its recycler view which recycle its view on scroll.

Upvotes: 0

VinayS
VinayS

Reputation: 11

You need write that code in onBindViewHolder()

        if (position == 0){
              //Inflate for 1st row
        }
        else {
              //Inflate for remaining rows
         }

Upvotes: 1

Related Questions