-1

There is a delay in updating the list of Recycler views. When items in the list are small, they are processed quickly, but when items are large, delays occur. The model of all items is the same, but it does not seem to be possible to use methods like NotifyItemChanged because it expresses different information and number.

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

If I click on a specific view, it will be called back to the above method, and clear the list that was originally in the recycler view and update the new list to be shown. The rest of the code is responsible for additional processing. I tried to calculate the time using the 'System.currentTimeMillis' method, but it does not seem to cause delays in additional code.

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

This is a recycler view adapter class. In the onBindViewHolder method of the adapter, even if I calculate the time using System.currentTimeMillis, I can not see anything that delay could happen. It took 0.005 to 0.01 seconds. There is a place of doubt, but I do not know exactly where to check it. It looks like there is a difference of about 0.6 seconds between 'onFolderCoverImgClick' and onBindViewHolder.

videoPortraitAdapter is an instance of VideoItemAdapter. If you know anyone, I would appreciate it if you could.

VIISHRUT MAVANII
  • 11,410
  • 7
  • 34
  • 49
Junburg
  • 350
  • 5
  • 23
  • You can either start a loading message at the start of item click and dismiss once data is changed or else you can implement Lazy loading /Load more. Also I think you can make that 2 `For` loops into a single one. – Sunil Sunny Mar 25 '19 at 05:38

2 Answers2

0

You can use new ListAdapter instead of RecyclerView.Adapter which provides the submitList() method which manages the differences in the lists and updates those only. Refer this link.

0

Better alternative option is by using setting up swipe to refresh and use

mSwipeRefreshLayout.setRefreshing(false); - in place where updating the adapter is done or NotifyItemChanged.

This has always worked for me, hope this helps you.

Rajiv Reddy
  • 339
  • 1
  • 11