android - 如何使用不同类型的项目制作 RecyclerView?
问题描述
我有不同类型的项目列表。在这种情况下如何制作 RecyclerView?我有用户类。在这个类中,我有变量地址地址类型。地址类也有自己的变量。我试着按照我的建议去做,但它不能正常工作。仅显示用户数据。地址数据不输出。
我的第一个项目类:
public class User {
private Integer id;
private String name;
private String username;
private String email;
private Address address;
获取器,设置器 }
我的 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, parent, false));
}else return new AddressViewHolder(layoutInflater.inflate(R.layout.list_item, parent, 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, parent, false));
}else return AddressViewHolder(layoutInflater.inflate(R.layout.list_item, parent, 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);
}
}
}
推荐阅读
- python - 由于值解包,XPATH 到 Excel 失败
- python - 如何删除列之间的重复值,而不管它们在 python 或 pyspark 中的顺序如何?
- persistence - GlusterFS 挂载失败
- escaping - 如何在scriptella中转义特殊字符
- c# - C# - ServerCertificateValidationCallback 报告 NotSignatureValid
- python - 在 DataFrame 的开头添加 MultiIndex 汇总列
- ruby-on-rails - 为什么我需要在我的 EC2 安全组中允许“所有 TCP”才能访问我的应用程序?
- c# - 找不到 SteamVR_Controller
- python - Flask 应用程序未正确使用配置文件设置
- ios - iOS 12.0:有没有办法将 MFMailComposeViewController 导航栏标题的文本设置为白色?