【发布时间】:2019-04-06 13:34:25
【问题描述】:
就性能而言,在 android 应用中实现的更好选择:
- 为每个具有不同对象的单个列表的多个适配器 布局,
- 处理不同数据的单个适配器。
假设我们需要创建
- 评论,
视频,
-
问题
适配器中的列表以正确显示数据。每个列表属于不同的布局,所以我们有不同的
TextViews、ImageViews等等。公共类 FilesAdapter 扩展 RecyclerView.Adapter {
public static final int VIDEO_FILES_ADAPTER = 1; 公共静态最终诠释 COMMENT_ADAPTER = 2; public static final int QUESTIONS_ADAPTER = 3;
private int CURRENT_ADAPTER;
私人列表视频文件; 私有列表 cmets; 私人列表问题;
boolean isForUser;
public FilesAdapter(int currentAdapter, List videoFiles, boolean isForUser){ this.videoFiles = 视频文件; this.CURRENT_ADAPTER = 当前适配器; this.isForUser = isForUser; }
public FilesAdapter(int currentAdapter, List cmets){ this.cmets = cmets; this.CURRENT_ADAPTER = 当前适配器; }
public FilesAdapter(int currentAdapter, List questions, int usedVariable){ this.questions = 问题; this.CURRENT_ADAPTER = 当前适配器; }
@NonNull @覆盖 public FilesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 查看视图; FilesViewHolder viewHolder;
switch(CURRENT_ADAPTER){ case VIDEO_FILES_ADAPTER: if(isForUser){ view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_layout_file_user, parent, false); }else{ view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_layout_file_main, parent, false); } viewHolder = new FilesViewHolder(VIDEO_FILES_ADAPTER, view, isForUser); return viewHolder; case COMMENT_ADAPTER: view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_layout_comment, parent, false); viewHolder = new FilesViewHolder(COMMENT_ADAPTER, view, false); return viewHolder; case QUESTIONS_ADAPTER: view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_layout_question, parent, false); viewHolder = new FilesViewHolder(QUESTIONS_ADAPTER, view, false); return viewHolder; } return null;}
@覆盖 public void onBindViewHolder(@NonNull FilesViewHolder holder, int position) {
switch (CURRENT_ADAPTER){ case VIDEO_FILES_ADAPTER: holder.videoTitle.setText(videoFiles.get(position).getFileName()); holder.videoDescription.setText(videoFiles.get(position).getFileDescription()); if(isForUser){ holder.videoDate.setText(videoFiles.get(position).getFileCreatedAt()); }else{ holder.videoUser.setText(videoFiles.get(position).getUsername()); } holder.videoCount.setText(videoFiles.get(position).getWatched()); break; case COMMENT_ADAPTER: holder.commentComment.setText(comments.get(position).getComment()); holder.commentUsername.setText(comments.get(position).getUsername()); holder.commentCreatedAt.setText(comments.get(position).getCreatedAt()); break; case QUESTIONS_ADAPTER: holder.questionTitle.setText(questions.get(position).getProviderUsername()); break; }}
@覆盖 公共 int getItemCount() {
switch (CURRENT_ADAPTER){ case VIDEO_FILES_ADAPTER: return videoFiles.size(); case COMMENT_ADAPTER: return comments.size(); case QUESTIONS_ADAPTER: return questions.size(); } return 0;}
公共静态类 FilesViewHolder 扩展 RecyclerView.ViewHolder{
private static final int VIDEO_FILES_ADAPTER = 1; private static final int COMMENT_ADAPTER = 2; private static final int QUESTIONS_ADAPTER = 3; private int CURRENT_ADAPTER; // Related to audio file class public TextView videoTitle, videoDescription, videoDate, videoUser, videoCount; // Related to comment class private TextView commentComment, commentUsername, commentCreatedAt; // Related to subscription class private TextView questionTitle; // @param isForUser applies only if CURRENT_ADAPTER == VIDEO_FILES_ADAPTER public FilesViewHolder(int CURRENT_ADAPTER, View itemView, boolean isForUser) { super(itemView); switch(CURRENT_ADAPTER){ case VIDEO_FILES_ADAPTER: videoTitle = itemView.findViewById(R.id.tV_title); videoDescription = itemView.findViewById(R.id.tV_description); if(isForUser){ videoDate = itemView.findViewById(R.id.tV_date); }else{ videoUser = itemView.findViewById(R.id.tV_username); } videoCount = itemView.findViewById(R.id.tV_watched); break; case COMMENT_ADAPTER: commentComment = itemView.findViewById(R.id.tV_comment); commentUsername = itemView.findViewById(R.id.tV_comment_username); commentCreatedAt = itemView.findViewById(R.id.tV_comment_created_at); break; case QUESTIONS_ADAPTER: questionTitle = itemView.findViewById(R.id.tV_question); break; } }} }
还有另一种方法可以做到这一点。 每个列表的单个适配器,例如:
public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentViewHolder>{
private List<Comment> commentList;
public CommentAdapter(List<Comment> comments){
this.commentList = comments;
}
public static class CommentViewHolder extends RecyclerView.ViewHolder{
private TextView comment, username, createdAt;
public CommentViewHolder(View itemView) {
super(itemView);
comment = itemView.findViewById(R.id.tV_comment);
username = itemView.findViewById(R.id.tV_comment_username);
createdAt = itemView.findViewById(R.id.tV_comment_created_at);
}
}
@NonNull
@Override
public CommentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_layout_comment, parent, false);
return new CommentViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull CommentViewHolder holder, int position) {
holder.comment.setText(commentList.get(position).getComment());
holder.username.setText(commentList.get(position).getUsername());
holder.createdAt.setText(commentList.get(position).getCreatedAt());
}
@Override
public int getItemCount() {
return commentList.size();
}
}
我的问题是在性能方面什么会更好实施?如果我决定为不同的列表实现一个适配器,是否会出现明显的性能延迟或补丁?
【问题讨论】:
标签: java android performance android-recyclerview