Reputation: 109
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
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
Reputation: 11
You need write that code in onBindViewHolder()
if (position == 0){
//Inflate for 1st row
}
else {
//Inflate for remaining rows
}
Upvotes: 1