问题描述
我有包含不同类型项目的列表。在这种情况下如何制作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);
}
}
}