Несколько адаптеров или один адаптер для разных списков и объектов - производительность кода - PullRequest
0 голосов
/ 02 ноября 2018

С точки зрения производительности, какой вариант лучше реализовать в приложении для Android:

  • несколько адаптеров для каждого списка объектов с разными макеты,
  • один адаптер, который обрабатывает разные данные.

Предположим, нам нужно создать

  • Комментарии
  • Видео

  • Вопросы

    списки в адаптере для правильного отображения данных. Каждый список относится к разным макетам, поэтому у нас разные TextViews, ImageViews и т. Д.

    открытый класс FilesAdapter расширяет RecyclerView.Adapter {

    public static final int VIDEO_FILES_ADAPTER = 1; public static final int COMMENT_ADAPTER = 2; public static final int QUESTIONS_ADAPTER = 3;

    private int CURRENT_ADAPTER;

    личный список видеофайлов; личный список комментариев; закрытый список вопросов;

    логическое значение isForUser;

    public FilesAdapter (int currentAdapter, Список видеофайлов, логическое значение isForUser) { this.videoFiles = videoFiles; this.CURRENT_ADAPTER = currentAdapter; this.isForUser = isForUser; }

    public FilesAdapter (int currentAdapter, Список комментариев) { this.comments = комментарии; this.CURRENT_ADAPTER = currentAdapter; }

    public FilesAdapter (int currentAdapter, Список вопросов, int unusedVariable) { this.questions = вопросы; this.CURRENT_ADAPTER = currentAdapter; }

    @ ненулевым @Override public FilesViewHolder onCreateViewHolder (родительский элемент @NonNull ViewGroup, 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;
    

    }

    @ Override public void onBindViewHolder (держатель @NonNull FilesViewHolder, позиция int) {

    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;
    }
    

    }

    @ Override public 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;
        }
    
    }
    

    } }

Есть еще один способ сделать это. Один адаптер для каждого списка, например ::1010*

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();
}

}

Мой вопрос с точки зрения производительности, что было бы лучше реализовать? Будут ли какие-либо заметные задержки или исправления в производительности, если я решу внедрить один адаптер для разных списков?

1 Ответ

0 голосов
/ 02 ноября 2018

Независимо от сложности ваших макетов и обработки прикрепления к вашим ячейкам, я рекомендую вам использовать один адаптер для каждого списка.

Просто небольшая картинка, иллюстрирующая в основном работу RecyclerView: Операция RecyclerView

В соответствии с документацией RecyclerView.Adapter: метод createViewHolder() вызывается, когда необходимо создать новую повторно используемую ячейку (в зависимости от количества ячеек, которые могут отображаться на экране). Таким образом, выполнение заявлений не сильно повлияет на производительность. onCreateViewHolder() можно было бы вызвать чуть больше 10 раз, если на экране отображается 10 ячеек. Проблема может быть в onBindViewHolder(), который вызывается каждый раз, когда RecyclerView необходимо отобразить новую ячейку. Поэтому, если у вас есть список из 100 элементов, а ваш пользователь перебирается вниз, система выполнит 100, если операторов больше, чем обычно.

Более того, я думаю, что ваш код будет более понятным, если вы создадите отдельные адаптеры для каждого списка.

В заключение я скажу, что я не совсем уверен, что система будет менее эффективной благодаря одному адаптеру для всего приложения. Потеря производительности не будет заметна. Я имею в виду, что самый важный момент - убедиться, что ваш код легко понять, иначе вы потеряете время на отладку кода в будущем. Я советую вам протестировать жизненный цикл RecyclerView, установив точки останова на onCreateViewHolder и onBindViewHolder (и более, если вам интересно), чтобы понять, когда они вызываются.

Надеюсь, это поможет вам! Удачи и веселья с вашим приложением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...