Skip to content Skip to sidebar Skip to footer

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?"