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