如何解决实例化 RecyclerView 的通用适配器
我是 recyclerview 的新手。我按照@SebastienRieu 的回答,即This link,为不同的属性创建了通用适配器。问题是我想实例化适配器并将其设置为我的回收站视图。我该怎么做?
这里,第二个参数是上下文。应该用什么替换第一个参数?
GenericModelAdapter adapter= new GenericModelAdapter(??,this)
recyclerView.setAdapter(adapter);
感谢任何帮助。
我的 PostModelClass:
public class PostsModelClass {
int userId;
int id;
String title;
@SerializedName("body")
String textBody;
public int getUserId() {
return userId;
}
public int getId() {
return id;
}
public String getTitle() {
return title;
}
public String getTextBody() {
return textBody;
}
}
同样,这是我的 CommentsModel 类:
public class CommentsModelClass {
String postId;
String id;
String name;
String email;
@SerializedName("body")
String textBody;
public String getPostId() {
return postId;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public String getTextBody() {
return textBody;
}
这是我的适配器:
public class GenericModelAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
private static final int TYPE_POSTS = 10;
private static final int TYPE_COMMENTS = 11;
private static final int TYPE_PHOTOS = 12;
private static final int TYPE_USERS = 13;
private List<GenericViewModel> mItems;
public GenericModelAdapter(List<GenericViewModel> items,Context context) {
this.mItems = items;
this.mContext = context;
}
@Override
public int getItemViewType(int position) {
GenericViewModel genericItems = mItems.get(position);
if (genericItems.isPostsModel()) {
return TYPE_POSTS;
} else if (genericItems.isCommentsModel()) {
return TYPE_COMMENTS;
} else if (genericItems.isPhotosModel()) {
return TYPE_PHOTOS;
} else {
return TYPE_USERS;
}
}
public static class PostViewHolder extends RecyclerView.ViewHolder {
TextView textViewResult;
PostViewHolder(@NonNull View itemView) {
super(itemView);
textViewResult = itemView.findViewById(R.id.textViewResult);
}
}
public static class CommentsViewHolder extends RecyclerView.ViewHolder {
TextView textViewResult;
CommentsViewHolder(@NonNull View itemView) {
super(itemView);
textViewResult = itemView.findViewById(R.id.textViewResult);
}
}
public static class PhotosViewHolder extends RecyclerView.ViewHolder {
TextView textViewResult;
PhotosViewHolder(@NonNull View itemView) {
super(itemView);
textViewResult = itemView.findViewById(R.id.textViewResult);
}
}
public static class UsersViewHolder extends RecyclerView.ViewHolder {
TextView textViewResult;
UsersViewHolder(@NonNull View itemView) {
super(itemView);
textViewResult = itemView.findViewById(R.id.textViewResult);
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
LayoutInflater inflater = LayoutInflater.from(mContext);
if (viewType == TYPE_POSTS) {
View rootView = inflater.inflate(R.layout.single_item,parent,false);
return new PostViewHolder(rootView);
} else if (viewType == TYPE_COMMENTS) {
View rootView = inflater.inflate(R.layout.single_item,false);
return new CommentsViewHolder(rootView);
} else if (viewType == TYPE_PHOTOS) {
View rootView = inflater.inflate(R.layout.single_item,false);
return new PhotosViewHolder(rootView);
} else {
View rootView = inflater.inflate(R.layout.single_item,false);
return new UsersViewHolder(rootView);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder,int position) {
GenericViewModel genericViewModel = mItems.get(position);
if (genericViewModel.isPostsModel()) {
onBindPost(holder,genericViewModel.getPostsModelClass());
} else if (genericViewModel.isCommentsModel()) {
//onBindComments(holder,genericViewModel.getCommentsModelClass());
} else if (genericViewModel.isPhotosModel()) {
//onBindPhotos(holder,genericViewModel.getPhotosModelClass());
} else if (genericViewModel.isUsersModel()) {
//onBindUsers(holder,genericViewModel.getUsersModelClass());
}
}
private void onBindPost(RecyclerView.ViewHolder holder,PostsModelClass postsModelClass) {
String content = "User ID: " + postsModelClass.getUserId() +
"\nID: " + postsModelClass.getId() +
"\nTitle: " + postsModelClass.getTitle() +
"\nBody: " + postsModelClass.getTextBody();
((PostViewHolder) holder).textViewResult.setText(content);
}
@Override
public int getItemCount() {
return mItems.size();
}
}
最后,我的 GenericViewModel:
public class GenericViewModel {
private PostsModelClass mPostsModelClass;
private CommentsModelClass mCommentsModelClass;
private PhotosModelClass mPhotosModelClass;
private UsersModelClass mUsersModelClass;
private GenericViewModel(PostsModelClass postsModelClass,CommentsModelClass commentsModelClass,PhotosModelClass photosModelClass,UsersModelClass usersModelClass) {
this.mPostsModelClass = postsModelClass;
this.mCommentsModelClass = commentsModelClass;
this.mPhotosModelClass = photosModelClass;
this.mUsersModelClass = usersModelClass;
}
public boolean isPostsModel() {
return mPostsModelClass != null;
}
public boolean isCommentsModel() {
return mCommentsModelClass != null;
}
public boolean isPhotosModel() {
return mPhotosModelClass != null;
}
public boolean isUsersModel() {
return mUsersModelClass != null;
}
public static GenericViewModel getPostsInstance(PostsModelClass modelClass) {
return new GenericViewModel(modelClass,null,null);
}
public static GenericViewModel getCommentsInstance(CommentsModelClass modelClass) {
return new GenericViewModel(null,modelClass,null);
}
public static GenericViewModel getPhotosInstance(PhotosModelClass modelClass) {
return new GenericViewModel(null,null);
}
public static GenericViewModel getUsersInstance(UsersModelClass modelClass) {
return new GenericViewModel(null,modelClass);
}
public PostsModelClass getPostsModelClass() {
return mPostsModelClass;
}
public CommentsModelClass getCommentsModelClass() {
return mCommentsModelClass;
}
public PhotosModelClass getPhotosModelClass() {
return mPhotosModelClass;
}
public UsersModelClass getUsersModelClass() {
return mUsersModelClass;
}
}
是的,我没有分享帖子和用户的模型类。它们类似于这些模型类,我稍后会实现它们。
这是我面临的错误:
解决方法
根据您在问题中提供的参考,您需要一个包含所有不同属性的模型,例如 {{3}} 中的 EventViewModel,并根据 viewType 填充列表。>
ArrayList<EventViewModel> eventList = "YOUR LIST"
GenericModelAdapter adapter= new GenericModelAdapter(eventList,this)
,
必须是不同集合属性的ArrayList:
GenericModelAdapter adapter= new GenericModelAdapter(ArrayList<YourModel> eventList,this)
您的模型:
public class YourModel() {
private Property1 mProperty1;
private Property2 mProperty2;
private YourModel(Property1 property1,Property2 property2) {
this.mProperty1 = property1;
this.mProperty2 = property2;
}
public boolean isProperty1() {
return mProperty1 != null
}
public boolean isProperty2() {
return mProperty2 != null
}
public static YourModel getProperty1Instance(Property1 property1) {
return new YourModel(property1,null);
}
public static EventViewModel getProperty2Instance(Property1 property2) {
return new YourModel(null,property2);
}
public Property1 getProperty1() {
return mProperty1;
}
public Property2 getProperty2() {
return mProperty2;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。