如何用不同类型的物品制作RecyclerView?

问题描述

我有包含不同类型项目的列表。在这种情况下如何制作RecyclerView? 我有User类。在此类中,我具有可变的地址地址类型。地址类也有自己的变量。 我尝试按照建议进行操作,但是无法正常工作。仅显示用户数据。地址数据不输出

我的第一类物品:

public class User {
    private Integer id;
    private String name;
    private String username;
    private String email;
    private Address address;

getters,setters }

我的seconf项目类别:

public class Address {
    private String street;
    private String suite;
    private String city;
getters,setters
}

我的适配器类:

   public class ResultAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private static int TYPE_ADDRESS = 1;
    private static int TYPE_USER = 2;

    private LayoutInflater layoutInflater;
    private Context context;
    private List<User> users;

    public ResultAdapter(Context context,List<User> users) {
        this.users = users;
        this.layoutInflater = LayoutInflater.from(context);
        this.context = context;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
        if (viewType == TYPE_ADDRESS){
            return new AddressViewHolder (layoutInflater.inflate(R.layout.list_item,parent,false));
        }else if(viewType == TYPE_USER){
            return new UsersViewHolder(layoutInflater.inflate(R.layout.list_item,false));
        }else return new AddressViewHolder(layoutInflater.inflate(R.layout.list_item,false));
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder,int position) {
if (holder instanceof AddressViewHolder){
Address address = new Address();
((AddressViewHolder) holder).city.setText(address.getCity());
} else if (holder instanceof UsersViewHolder){

    final User user = users.get(position);
    ((UsersViewHolder) holder).name.setText(user.getName());

}
    }


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

    @Override
    public int getItemViewType(int position) {
      if (position==1){
          return TYPE_ADDRESS;
      }else
          return TYPE_USER;
    }

public static class AddressViewHolder extends RecyclerView.ViewHolder{
final TextView city;
    public AddressViewHolder(@NonNull View itemView) {
        super(itemView);
        city = itemView.findViewById(R.id.city);
    }
}

   public static class  UsersViewHolder extends RecyclerView.ViewHolder{
       final TextView name;
        public UsersViewHolder(@NonNull View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.name);

        }
    }
}

解决方法

        public class GenericAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
                private static int TYPE_ADDRESS = 1;
                private static int TYPE_USER = 2;
            
                private LayoutInflater layoutInflater;
                private List<User> users;
                private Context context;
            
                public GenericAdapter(Context context,List<User> users) {
                    this.users = users;
                    this.layoutInflater = LayoutInflater.from(context);
                    this.context = context;
                }
            
                @NonNull
                @Override
                public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
                   if(viewType == TYPE_ADDRESS){
                       return AddressViewHolder(layoutInflater.inflate(R.layout.list_item,parent,false));
                   }else if(viewType == TYPE_USER){
                       return UsersViewHolder(layoutInflater.inflate(R.layout.list_item,false));
                   }else return AddressViewHolder(layoutInflater.inflate(R.layout.list_item,false));
                }
            
                @Override
                public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder,int position) {
                    if(holder instanceof AddressViewHolder){
                        /*Your binding */
                    }else if(holder instanceof UsersViewHolder){
                        /*Your binding */
                    }
            
                }
            
                @Override
                public int getItemCount() {
                    return users.size();
                }
            
                @Override
                public int getItemViewType(int position) {
                    /*Please specify your logic here of selecting the type optionally you can use the position to query the data and decide on it*/
                    return (position % 2 == 0 )? TYPE_ADDRESS : TYPE_USER;
                }
            
                 class AddressViewHolder extends RecyclerView.ViewHolder{
            
                    public AddressViewHolder(@NonNull View itemView) {
                        super(itemView);
                    }
                }
            
                 class UsersViewHolder extends RecyclerView.ViewHolder{
            
                    public UsersViewHolder(@NonNull View itemView) {
                        super(itemView);
                    }
                }
            
            }