Android 如何使用同一适配器在回收器视图上显示多个模型?

Android 如何使用同一适配器在回收器视图上显示多个模型?,android,model-view-controller,android-recyclerview,Android,Model View Controller,Android Recyclerview,我有两种不同类型的对象(例如:User和Student),它们都具有不同的属性 用户: 标题、说明 学生: 标题、说明、USN 是否有一种方法可以使用同一个适配器在“回收器”视图上首先显示两个用户,然后显示学生?即使是两个适配器,如何显示它。我不想看到两个回收站 请注意,给出的示例非常简单。改变不仅仅是在UI中。如果更改仅在UI中,则可以使用getItemViewType(),但此处的更改在模型本身中 列表和列表 如何将这两个列表设置为同一适配器?只需使用viewType,返回不同的viewTy

我有两种不同类型的对象(例如:User和Student),它们都具有不同的属性

用户: 标题、说明
学生: 标题、说明、USN

是否有一种方法可以使用同一个适配器在“回收器”视图上首先显示两个用户,然后显示学生?即使是两个适配器,如何显示它。我不想看到两个回收站

请注意,给出的示例非常简单。改变不仅仅是在UI中。如果更改仅在UI中,则可以使用getItemViewType(),但此处的更改在模型本身中

列表
列表


如何将这两个列表设置为同一适配器?

只需使用viewType,返回不同的viewType并在onBindViewHolder中绑定不同的数据

您必须使用覆盖方法“getItemViewType(position)”

然后,只需按照ViewType返回ViewHolder,如下所示

  @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder viewHolder = null;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());

    switch (viewType) {
        case ITEM:
            View v1 = inflater.inflate(R.layout.item_student, parent, false);
            viewHolder = new UserVH(v1);
            break;
        case LOADING:
            View v2 = inflater.inflate(R.layout.item_user, parent, false);
            viewHolder = new StudentVH(v2);
            break;
    }
    return viewHolder;
}
public class ClGAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<UserBean> userBeans;
private List<StudentBean> studentBeans;
private UserBean userBeanItem;
private StudentBean studentBeanItem;
private int size = 0;


public ClGAdapter(Context context, List<UserBean> userBeans, List<StudentBean> studentBeans) {
    this.context = context;
    this.userBeans = userBeans;
    this.studentBeans = studentBeans;
    this.size = userBeans.size() + studentBeans.size();
}


@Override
public int getItemViewType(int position) {

    if (position > (userBeans.size() - 1)) {
        return 2;//TYPE_STUDENT
    } else {
        return 1; //TYPE_USER
    }
}

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

    int viewType = holder.getItemViewType();

    userBeanItem = userBeans.get(position);
    studentBeanItem = studentBeans.get(position);
    switch (viewType) {
        case 1:
            ((UserHolder) holder).mUserName.setText(userBeanItem.getUserName());
            break;
        case 2:
            ((StudentHolder) holder).mStudentName.setText(studentBeanItem.getStudentName());
            break;
        default:
            break;
    }

}

@Override
public int getItemCount() {
    return size;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    int layout = 0;
    RecyclerView.ViewHolder viewHolder;
    switch (viewType) {
        case 1: 
            layout = R.layout.user_card;
            View userView = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
            viewHolder = new UserHolder(userView);
            break;
        case 2:
            layout = R.layout.student_card;
            View studentView = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
            viewHolder = new StudentHolder(studentView);

            break;
        default:
            viewHolder = null;
            break;
    }
    return viewHolder;
}

public class UserHolder extends RecyclerView.ViewHolder {
    private TextView mUserName;

    public UserHolder(View v) {
        super(v);
        mUserName = v.findViewById(R.id.user_name);
    }
}

public class StudentHolder extends RecyclerView.ViewHolder {
    private TextView mStudentName;

    public StudentHolder(View v) {
        super(v);
        mStudentName = v.findViewById(R.id.student_name);
    }
}
}
编辑:

第二次编辑:

您的适配器应该是这样的

  @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder viewHolder = null;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());

    switch (viewType) {
        case ITEM:
            View v1 = inflater.inflate(R.layout.item_student, parent, false);
            viewHolder = new UserVH(v1);
            break;
        case LOADING:
            View v2 = inflater.inflate(R.layout.item_user, parent, false);
            viewHolder = new StudentVH(v2);
            break;
    }
    return viewHolder;
}
public class ClGAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<UserBean> userBeans;
private List<StudentBean> studentBeans;
private UserBean userBeanItem;
private StudentBean studentBeanItem;
private int size = 0;


public ClGAdapter(Context context, List<UserBean> userBeans, List<StudentBean> studentBeans) {
    this.context = context;
    this.userBeans = userBeans;
    this.studentBeans = studentBeans;
    this.size = userBeans.size() + studentBeans.size();
}


@Override
public int getItemViewType(int position) {

    if (position > (userBeans.size() - 1)) {
        return 2;//TYPE_STUDENT
    } else {
        return 1; //TYPE_USER
    }
}

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

    int viewType = holder.getItemViewType();

    userBeanItem = userBeans.get(position);
    studentBeanItem = studentBeans.get(position);
    switch (viewType) {
        case 1:
            ((UserHolder) holder).mUserName.setText(userBeanItem.getUserName());
            break;
        case 2:
            ((StudentHolder) holder).mStudentName.setText(studentBeanItem.getStudentName());
            break;
        default:
            break;
    }

}

@Override
public int getItemCount() {
    return size;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    int layout = 0;
    RecyclerView.ViewHolder viewHolder;
    switch (viewType) {
        case 1: 
            layout = R.layout.user_card;
            View userView = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
            viewHolder = new UserHolder(userView);
            break;
        case 2:
            layout = R.layout.student_card;
            View studentView = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
            viewHolder = new StudentHolder(studentView);

            break;
        default:
            viewHolder = null;
            break;
    }
    return viewHolder;
}

public class UserHolder extends RecyclerView.ViewHolder {
    private TextView mUserName;

    public UserHolder(View v) {
        super(v);
        mUserName = v.findViewById(R.id.user_name);
    }
}

public class StudentHolder extends RecyclerView.ViewHolder {
    private TextView mStudentName;

    public StudentHolder(View v) {
        super(v);
        mStudentName = v.findViewById(R.id.student_name);
    }
}
}
公共类ClGAdapter扩展了RecyclerView.Adapter{
私人语境;
私有列表用户bean;
私有列表studentBeans;
私有UserBean userBeanItem;
私人学生Bean studentBeanItem;
私有整数大小=0;
公共ClGAdapter(上下文上下文、List userBeans、List studentBeans){
this.context=上下文;
this.userBeans=userBeans;
this.studentBeans=studentBeans;
this.size=userBeans.size()+studentBeans.size();
}
@凌驾
public int getItemViewType(int位置){
if(位置>(userBeans.size()-1)){
返回2;//键入\u STUDENT
}否则{
返回1;//键入用户
}
}
@凌驾
公共无效onBindViewHolder(最终RecyclerView.ViewHolder,最终整型位置){
int viewType=holder.getItemViewType();
userBeanItem=userBeans.get(位置);
studentBeanItem=studentBeans.get(位置);
开关(视图类型){
案例1:
((UserHolder)holder.mUserName.setText(userBeanItem.getUserName());
打破
案例2:
((StudentHolder)holder.mStudentName.setText(studentBeanItem.getStudentName());
打破
违约:
打破
}
}
@凌驾
public int getItemCount(){
返回大小;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
int布局=0;
RecyclerView.ViewHolder-ViewHolder;
开关(视图类型){
案例1:
布局=R.layout.user\u卡;
View userView=LayoutInflater.from(parent.getContext()).FILLATE(布局,父级,false);
viewHolder=新用户持有者(userView);
打破
案例2:
布局=R.layout.student_卡;
View studentView=LayoutInflater.from(parent.getContext()).flate(布局,父级,false);
viewHolder=新的StudentHolder(studentView);
打破
违约:
viewHolder=null;
打破
}
返回视图持有者;
}
公共类UserHolder扩展了RecyclerView.ViewHolder{
私人文本视图博物馆名称;
公共用户持有者(视图v){
超级(五);
mUserName=v.findviewbyd(R.id.user\u name);
}
}
公共类StudentHolder扩展了RecyclerView.ViewHolder{
私有文本视图mStudentName;
公共学生家长(视图五){
超级(五);
mStudentName=v.findviewbyd(R.id.student\u name);
}
}
}

我将为您提供我的实现,希望对您有所帮助:

public class UserStudentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static final int USER_VIEW_TYPE = 0;
    private static final int STUDENT_VIEW_TYPE = 1;

    private List<User> mUserData;
    private List<Student> mStudentData;

    @Override
    public 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);
                return new HeaderViewHolder(view);
            case CONTENT_VIEW_TYPE:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_index, parent, false);
                return new ItemViewHolder(view);
            default:
                return null;
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (getItemViewType(position)) {
            case USER_VIEW_TYPE:
                //Show User data
                break;
            case STUDENT_VIEW_TYPE:
                //Show Student data
                break;
            default:
                break;
        }
    }

    @Override
    public int getItemCount() {
        return mUserData.size() + mStudentData.size();
    }

    @Override
    public int getItemViewType(int position) {
        return (position % 2 == 0) ? STUDENT_VIEW_TYPE : USER_VIEW_TYPE;
    }

}
公共类UserStudentAdapter扩展了RecyclerView.Adapter{
私有静态最终int用户\视图\类型=0;
私有静态最终int学生视图类型=1;
私人名单博物馆数据;
私有列表mStudentData;
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图;
开关(视图类型){
案例标题\视图\类型:
view=LayoutInflater.from(parent.getContext()).flate(R.layout.item\u definition\u头,parent,false);
返回新的HeaderViewHolder(视图);
案例内容\视图\类型:
view=LayoutInflater.from(parent.getContext()).flate(R.layout.item_index,parent,false);
返回新的ItemViewHolder(视图);
违约:
返回null;
}
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
开关(getItemViewType(位置)){
案例用户\视图\类型:
//显示用户数据
打破
案例学生视图类型:
//显示学生数据
打破
违约:
打破
}
}
@凌驾
public int getItemCount(){
返回mUserData.size()+mStudentData.size();
}
@凌驾
public int getItemViewType(int位置){
返回(位置%2==0)?学生视图类型:用户视图类型;
}
}

学生的属性是什么。添加代码,以便其他人可以帮助您使用数据绑定来实现此目的。您可以在此处使用标记接口。您是否尝试使用“消耗性回收器”视图?可能重复的更改不仅仅存在于UI中。这与模型本身有关。如何将列表和列表设置为同一适配器?您必须为学生和用户创建两个不同的模型。我在回答中提到过。只有一个RecyclerView就足够了。谢谢您如何将两个列表设置为同一适配器?您给出的代码是关于ViewHolder的,而不是关于不同的型号检查我已经编辑了我的答案,请稍候,我将提供如何在同一适配器以及同一RecylclerViewHi中获取不同型号列表的代码,感谢您的编辑。我可以看到,在构造函数中,您只使用了一个列表,其中我有两个列表。这就是我的问题所在:(改变不只是在UI中。它与模型本身有关。如何将List和List设置为同一个适配器?您有两个选择。第一个