How To Display Multiple Models On Recycler View Using Same Adapter?
I have two different types of objects (ex: User and Student) both having different properties. User: Title, description; Student: Title, description, USN; Is there a way using whi
Solution 1:
You have to use the override method "getItemViewType(position)".
Then just return the ViewHolder as per the ViewType like this,
@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolderviewHolder=null;
LayoutInflaterinflater= LayoutInflater.from(parent.getContext());
switch (viewType) {
case ITEM:
Viewv1= inflater.inflate(R.layout.item_student, parent, false);
viewHolder = newUserVH(v1);
break;
case LOADING:
Viewv2= inflater.inflate(R.layout.item_user, parent, false);
viewHolder = newStudentVH(v2);
break;
}
return viewHolder;
}
Edit:
publicclassStudentVHextendsRecyclerView.ViewHolder {
//Declare student viewspublicViewHolder(View v) {
super(v);
//Inialize student views
}
}
publicclassUserVHextendsRecyclerView.ViewHolder {
//Declare user viewspublicViewHolder(View v) {
super(v);
//Inialize user views
}
}
Second Edit:
Your Adapter should be like this,
publicclassClGAdapterextendsRecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<UserBean> userBeans;
private List<StudentBean> studentBeans;
private UserBean userBeanItem;
private StudentBean studentBeanItem;
privateintsize=0;
publicClGAdapter(Context context, List<UserBean> userBeans, List<StudentBean> studentBeans) {
this.context = context;
this.userBeans = userBeans;
this.studentBeans = studentBeans;
this.size = userBeans.size() + studentBeans.size();
}
@OverridepublicintgetItemViewType(int position) {
if (position > (userBeans.size() - 1)) {
return2;//TYPE_STUDENT
} else {
return1; //TYPE_USER
}
}
@OverridepublicvoidonBindViewHolder(final RecyclerView.ViewHolder holder, finalint position) {
intviewType= holder.getItemViewType();
userBeanItem = userBeans.get(position);
studentBeanItem = studentBeans.get(position);
switch (viewType) {
case1:
((UserHolder) holder).mUserName.setText(userBeanItem.getUserName());
break;
case2:
((StudentHolder) holder).mStudentName.setText(studentBeanItem.getStudentName());
break;
default:
break;
}
}
@OverridepublicintgetItemCount() {
return size;
}
@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
intlayout=0;
RecyclerView.ViewHolder viewHolder;
switch (viewType) {
case1:
layout = R.layout.user_card;
ViewuserView= LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
viewHolder = newUserHolder(userView);
break;
case2:
layout = R.layout.student_card;
ViewstudentView= LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
viewHolder = newStudentHolder(studentView);
break;
default:
viewHolder = null;
break;
}
return viewHolder;
}
publicclassUserHolderextendsRecyclerView.ViewHolder {
private TextView mUserName;
publicUserHolder(View v) {
super(v);
mUserName = v.findViewById(R.id.user_name);
}
}
publicclassStudentHolderextendsRecyclerView.ViewHolder {
private TextView mStudentName;
publicStudentHolder(View v) {
super(v);
mStudentName = v.findViewById(R.id.student_name);
}
}
}
Solution 2:
I will give you my implementation, hope will help:
publicclassUserStudentAdapterextendsRecyclerView.Adapter<RecyclerView.ViewHolder> {
privatestaticfinalintUSER_VIEW_TYPE=0;
privatestaticfinalintSTUDENT_VIEW_TYPE=1;
private List<User> mUserData;
private List<Student> mStudentData;
@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
switch (viewType) {
case HEADER_VIEW_TYPE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_definition_header, parent, false);
returnnewHeaderViewHolder(view);
case CONTENT_VIEW_TYPE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_index, parent, false);
returnnewItemViewHolder(view);
default:
returnnull;
}
}
@OverridepublicvoidonBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (getItemViewType(position)) {
case USER_VIEW_TYPE:
//Show User databreak;
case STUDENT_VIEW_TYPE:
//Show Student databreak;
default:
break;
}
}
@OverridepublicintgetItemCount() {
return mUserData.size() + mStudentData.size();
}
@OverridepublicintgetItemViewType(int position) {
return (position % 2 == 0) ? STUDENT_VIEW_TYPE : USER_VIEW_TYPE;
}
}
Solution 3:
just use viewType, return different viewType and bind different data in onBindViewHolder
Post a Comment for "How To Display Multiple Models On Recycler View Using Same Adapter?"