Как решить задержку обновления списка просмотра recyclerv - PullRequest
0 голосов
/ 25 марта 2019

Существует задержка при обновлении списка представлений Recycler.Когда элементы в списке маленькие, они обрабатываются быстро, но когда элементы большие, возникают задержки.Модель всех предметов одинакова, но, похоже, невозможно использовать такие методы, как NotifyItemChanged, потому что она выражает различную информацию и число.

    @Override
public void onFolderCoverImgClick(int position) {
    setVideoTopBarByFolderData(position);
    AppVideoData.FolderData folderData = videoLayoutFolderList.get(position);
    String folderId = folderData.getFolderId();
    videoByFolderList.clear();
    for (int i = 0; i < videoLayoutList.size(); i++) {
        if (folderId.equals(videoLayoutList.get(i).getFolderId())) {
            videoByFolderList.add(videoLayoutList.get(i));
        }
    }
    String path = getFilesDir() + File.separator + "vid";
    for (int i = 0; i < videoByFolderList.size(); i++) {
        if (new File(path + File.separator + videoByFolderList.get(i).getId() + ".mp4").exists()) {
            videoByFolderList.get(i).setVideoType("Download");
        } else {
            videoByFolderList.get(i).setVideoType("vimeo");
        }
        if(videoIdF.equals(videoByFolderList.get(i).getId())) {
            videoPosF = i;
        }
    }
    videoPortraitAdapter.updateList(videoByFolderList);
    videoPortraitAdapter.checkSelectedVideoWhenFolder(videoPosF, videoIdF);
}

Если я нажимаю на конкретное представление, онобудет вызван обратно к вышеупомянутому методу, и очистите список, который был первоначально в представлении переработчика, и обновите новый список, который будет показан.Остальная часть кода отвечает за дополнительную обработку.Я пытался вычислить время с помощью метода 'System.currentTimeMillis', но, похоже, он не вызывает задержки в дополнительном коде.

public class VideoItemAdapter extends RecyclerView.Adapter<VideoItemAdapter.VideoViewHolder> {

public VideoItemAdapterListener videoItemAdapterListener;
public VideoItemDrawDoneListener videoItemDrawDoneListener;
private Context context;
private LiveActivity liveActivity;
private List<AppVideoData.AppYouTube> dataList;
private String skinColor;
private boolean fullScreen;
private boolean isFolder;
private int videoPosF;
private String videoIdF;

public VideoItemAdapter(Context context, List<AppVideoData.AppYouTube> dataList, String skinColor, boolean fullScreen, boolean isFolder) {
    this.context = context;
    this.dataList = dataList;
    this.skinColor = skinColor;
    this.fullScreen = fullScreen;
    if (context instanceof LiveActivity) {
        liveActivity = (LiveActivity) context;
    }
    this.isFolder = isFolder;
}

public void updateList(List<AppVideoData.AppYouTube> dataList) {
    this.dataList = dataList;
    notifyDataSetChanged();
}

public void setOnVideoItemClickListener(VideoItemAdapterListener videoItemAdapterListener) {
    this.videoItemAdapterListener = videoItemAdapterListener;
}

public void setOnVideoItemDrawDoneListener(VideoItemDrawDoneListener videoItemDrawDoneListener) {
    this.videoItemDrawDoneListener = videoItemDrawDoneListener;
}

@NonNull
@Override
public VideoItemAdapter.VideoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.video_item, parent, false);
    VideoViewHolder holder = new VideoViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull final VideoItemAdapter.VideoViewHolder holder, final int position) {
    Log.d("time", "onBindViewHolder: " + System.currentTimeMillis());
    int adapterPosition = 0;
    if(holder.getAdapterPosition() != RecyclerView.NO_POSITION) { adapterPosition = holder.getAdapterPosition(); }
    AppVideoData.AppYouTube videoData = dataList.get(adapterPosition);
    String videoType = videoData.getVideoType();
    Glide.with(context).load(videoData.getVideoThumbnail()).into(holder.itemThumbnail);
    holder.itemSelected.setImageResource(R.drawable.shining_selected);
    holder.itemTitle.setText(videoData.getTitle());
    holder.itemDivider.setBackgroundColor(Color.parseColor(skinColor));
    holder.itemDuration.setText(getDuration(videoData.getDuration()));
    changeVideo(holder, adapterPosition, videoData.getId());

    if (!videoType.equals("Download")) {
        holder.itemDownload.setVisibility(View.VISIBLE);
        holder.itemDelete.setVisibility(View.INVISIBLE);
    } else {
        holder.itemDownload.setVisibility(View.INVISIBLE);
        holder.itemDelete.setVisibility(View.VISIBLE);
    }

    if(fullScreen) {
        holder.itemDownload.setVisibility(View.INVISIBLE);
        holder.itemDelete.setVisibility(View.INVISIBLE);
    }
    Log.d("time", "onBindViewHolder1: " + System.currentTimeMillis());
}

@Override
public int getItemCount() {
    return (dataList != null) ? dataList.size() : 0;
}

private String getDuration(int original) {
    int hour = original / 60 / 60;
    int min = (original - (hour * 60 * 60)) / 60;
    int sec = original - (hour * 60 * 60) - (min * 60);
    return (hour > 0) ? String.format("%02d:%02d:%02d", hour, min, sec) : String.format("%02d:%02d", min, sec);
}

public void checkSelectedVideoWhenFolder(int videoPosF, String videoIdF) {
    this.videoPosF = videoPosF;
    this.videoIdF = videoIdF;
    notifyItemChanged(videoPosF);
}

private void changeVideo(VideoViewHolder holder, int position, String videoId) {
    if (!liveActivity.isFolder) {
        if ((liveActivity.videoPos == position)) {
            holder.itemSelected.setVisibility(View.VISIBLE);
        } else {
            holder.itemSelected.setVisibility(View.INVISIBLE);
        }
    } else {
        if ((videoPosF == position) && videoIdF.equals(videoId)) {
            holder.itemSelected.setVisibility(View.VISIBLE);
        } else {
            holder.itemSelected.setVisibility(View.INVISIBLE);
        }
    }
}

public class VideoViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    protected RelativeLayout itemBody;
    protected TextView itemTitle;
    protected TextView itemDuration;
    protected TextView itemDivider;
    protected ImageView itemThumbnail;
    protected ImageView itemSelected;
    protected ImageButton itemDownload;
    protected ImageButton itemDelete;

    public VideoViewHolder(View itemView) {
        super(itemView);
        itemBody = (RelativeLayout) itemView.findViewById(R.id.video_item_body);
        itemTitle = (TextView) itemView.findViewById(R.id.video_item_title);
        itemDuration = (TextView) itemView.findViewById(R.id.video_item_duration);
        itemDivider = (TextView) itemView.findViewById(R.id.video_item_divider);
        itemThumbnail = (ImageView) itemView.findViewById(R.id.video_item_thumbnail);
        itemSelected = (ImageView) itemView.findViewById(R.id.video_item_selected);
        itemDownload = (ImageButton) itemView.findViewById(R.id.video_item_download);
        itemDelete = (ImageButton) itemView.findViewById(R.id.video_item_delete);
        itemBody.setOnClickListener(this);
        itemDownload.setOnClickListener(this);
        itemDelete.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.video_item_body:
                videoItemAdapterListener.onVideoItemClick(getAdapterPosition(), fullScreen, itemSelected);
                break;
            case R.id.video_item_download:
                videoItemAdapterListener.onVideoDownloadClick(getAdapterPosition(), fullScreen);
                break;
            case R.id.video_item_delete:
                videoItemAdapterListener.onVideoDeleteClick(getAdapterPosition(), fullScreen);
                break;
        }
    }
}

Это класс адаптера представления переработчика.В методе onBindViewHolder адаптера, даже если я вычисляю время, используя System.currentTimeMillis, я не вижу ничего, что могло бы произойти задержка.Это заняло от 0,005 до 0,01 секунды.Есть сомнение, но я не знаю точно, где это проверить.Похоже, что разница между «onFolderCoverImgClick» и onBindViewHolder.

videoPortraitAdapter составляет около 0,6 секунд, это экземпляр VideoItemAdapter.Если вы кого-нибудь знаете, я был бы признателен, если бы вы могли.

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Лучшим альтернативным вариантом является настройка свайпа для обновления и использования

mSwipeRefreshLayout.setRefreshing(false); - в месте, где выполняется обновление адаптера или NotifyItemChanged.

Это всегда сработало для меня, надеюсь, это поможет вам.

0 голосов
/ 25 марта 2019

Вы можете использовать новый ListAdapter вместо RecyclerView.Adapter, который предоставляет метод submitList (), который управляет различиями в списках и обновляет только их. См. эту ссылку.

...