Skip to content
This repository has been archived by the owner on Mar 30, 2024. It is now read-only.

Commit

Permalink
fix: avoid creating listeners on each bind
Browse files Browse the repository at this point in the history
  • Loading branch information
jaiselrahman committed May 24, 2020
1 parent 1e68f6e commit b4f22eb
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 91 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
import androidx.recyclerview.widget.AsyncDifferConfig;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListUpdateCallback;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
Expand Down Expand Up @@ -118,73 +117,30 @@ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
if (showCamera) {
if (position == 0) {
handleCamera(holder.openCamera, false);
holder.bind(null, false);
return;
}
if (showVideoCamera) {
if (position == 1) {
handleCamera(holder.openVideoCamera, true);
holder.bind(null, true);
return;
}
holder.openVideoCamera.setVisibility(View.GONE);
position--;
}
holder.openCamera.setVisibility(View.GONE);
position--;
} else if (showVideoCamera) {
if (position == 0) {
handleCamera(holder.openVideoCamera, true);
holder.bind(null, true);
return;
}
holder.openVideoCamera.setVisibility(View.GONE);
position--;
}

super.onBindViewHolder(holder, position);

MediaFile mediaFile = getItem(position);

if (mediaFile.getMediaType() == MediaFile.TYPE_VIDEO ||
mediaFile.getMediaType() == MediaFile.TYPE_IMAGE) {
glideRequest.load(mediaFile.getUri())
.into(holder.fileThumbnail);
} else if (mediaFile.getMediaType() == MediaFile.TYPE_AUDIO) {
glideRequest.load(mediaFile.getThumbnail())
.apply(RequestOptions.placeholderOf(R.drawable.ic_audio))
.into(holder.fileThumbnail);
} else {
holder.fileThumbnail.setImageResource(R.drawable.ic_file);
}

if (mediaFile.getMediaType() == MediaFile.TYPE_VIDEO ||
mediaFile.getMediaType() == MediaFile.TYPE_AUDIO) {
holder.fileDuration.setVisibility(View.VISIBLE);
holder.fileDuration.setText(TimeUtils.getDuration(mediaFile.getDuration()));
} else {
holder.fileDuration.setVisibility(View.GONE);
}

if (mediaFile.getMediaType() == MediaFile.TYPE_FILE
|| mediaFile.getMediaType() == MediaFile.TYPE_AUDIO) {
holder.fileName.setVisibility(View.VISIBLE);
holder.fileName.setText(mediaFile.getName());
} else {
holder.fileName.setVisibility(View.GONE);
}

holder.fileSelected.setVisibility(isSelected(mediaFile) ? View.VISIBLE : View.GONE);
}

private void handleCamera(final ImageView openCamera, final boolean forVideo) {
openCamera.setVisibility(View.VISIBLE);
openCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onCameraClickListener != null && !onCameraClickListener.onCameraClick(forVideo))
return;
openCamera(forVideo);
}
});
holder.bind(mediaFile, null);
}

public void openCamera(boolean forVideo) {
Expand Down Expand Up @@ -300,7 +256,7 @@ public void onMaxReached() {
}
}

public static class ViewHolder extends RecyclerView.ViewHolder {
public class ViewHolder extends MultiSelectionAdapter.ViewHolder {
private ImageView fileSelected, openCamera, openVideoCamera;
private SquareImage fileThumbnail;
private TextView fileDuration, fileName;
Expand All @@ -313,6 +269,66 @@ public static class ViewHolder extends RecyclerView.ViewHolder {
fileDuration = v.findViewById(R.id.file_duration);
fileName = v.findViewById(R.id.file_name);
fileSelected = v.findViewById(R.id.file_selected);

openCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onCameraClickListener != null && !onCameraClickListener.onCameraClick(false))
return;
openCamera(false);
}
});

openVideoCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onCameraClickListener != null && !onCameraClickListener.onCameraClick(true))
return;
openCamera(true);
}
});
}

void bind(MediaFile mediaFile, Boolean forVideo) {
if (forVideo == null) {
openCamera.setVisibility(View.GONE);
openVideoCamera.setVisibility(View.GONE);
} else {
openCamera.setVisibility(forVideo ? View.GONE : View.VISIBLE);
openVideoCamera.setVisibility(forVideo ? View.VISIBLE : View.GONE);
}

if (mediaFile == null) return;

if (mediaFile.getMediaType() == MediaFile.TYPE_VIDEO ||
mediaFile.getMediaType() == MediaFile.TYPE_IMAGE) {
glideRequest.load(mediaFile.getUri())
.into(fileThumbnail);
} else if (mediaFile.getMediaType() == MediaFile.TYPE_AUDIO) {
glideRequest.load(mediaFile.getThumbnail())
.apply(RequestOptions.placeholderOf(R.drawable.ic_audio))
.into(fileThumbnail);
} else {
fileThumbnail.setImageResource(R.drawable.ic_file);
}

if (mediaFile.getMediaType() == MediaFile.TYPE_VIDEO ||
mediaFile.getMediaType() == MediaFile.TYPE_AUDIO) {
fileDuration.setVisibility(View.VISIBLE);
fileDuration.setText(TimeUtils.getDuration(mediaFile.getDuration()));
} else {
fileDuration.setVisibility(View.GONE);
}

if (mediaFile.getMediaType() == MediaFile.TYPE_FILE
|| mediaFile.getMediaType() == MediaFile.TYPE_AUDIO) {
fileName.setVisibility(View.VISIBLE);
fileName.setText(mediaFile.getName());
} else {
fileName.setVisibility(View.GONE);
}

fileSelected.setVisibility(isSelected(mediaFile) ? View.VISIBLE : View.GONE);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
import java.util.List;

@SuppressWarnings({"unused", "WeakerAccess"})
public abstract class MultiSelectionAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
public abstract class MultiSelectionAdapter<VH extends MultiSelectionAdapter.ViewHolder> extends RecyclerView.Adapter<VH> {
private static final String TAG = MultiSelectionAdapter.class.getSimpleName();
private ArrayList<MediaFile> selectedItems = new ArrayList<>();

Expand Down Expand Up @@ -146,47 +146,7 @@ public int getItemCount() {
@CallSuper
@Override
public void onBindViewHolder(@NonNull final VH holder, int position) {
final View view = holder.itemView;

view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getAdapterPosition() - itemStartPosition;
if (enabledSelection && (isSelectionStarted || isSingleClickSelection)) {
if (selectedItems.contains(getItem(position))) {
onSelectionListener.onUnSelected(holder, position);
if (selectedItems.isEmpty()) {
onSelectionListener.onSelectionEnd();
}
} else {
onSelectionListener.onSelected(holder, position);
}
}
if (onItemClickListener != null)
onItemClickListener.onClick(v, position);
}
});

setItemSelected(view, position, selectedItems.contains(getItem(position)));

view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int position = holder.getAdapterPosition() - itemStartPosition;
if (enabledSelection) {
if (!isSelectionStarted) {
onSelectionListener.onSelectionBegin();
onSelectionListener.onSelected(holder, position);
} else if (selectedItems.size() <= 1
&& selectedItems.contains(getItem(position))) {
onSelectionListener.onSelectionEnd();
onSelectionListener.onUnSelected(holder, position);
}
}
return onItemLongClickListener == null ||
onItemLongClickListener.onLongClick(view, position);
}
});
setItemSelected(holder.itemView, position, selectedItems.contains(getItem(position)));
}

@Override
Expand Down Expand Up @@ -322,4 +282,66 @@ public interface OnSelectionListener<VH> {

void onMaxReached();
}

private class SelectionLongClickListener implements View.OnLongClickListener {
private VH holder;

private SelectionLongClickListener(VH viewHolder) {
this.holder = viewHolder;
}

@Override
public boolean onLongClick(View v) {
int position = holder.getAdapterPosition() - itemStartPosition;
if (enabledSelection) {
if (!isSelectionStarted) {
onSelectionListener.onSelectionBegin();
onSelectionListener.onSelected(holder, position);
} else if (selectedItems.size() <= 1
&& selectedItems.contains(getItem(position))) {
onSelectionListener.onSelectionEnd();
onSelectionListener.onUnSelected(holder, position);
}
}
return onItemLongClickListener == null ||
onItemLongClickListener.onLongClick(holder.itemView, position);
}
}

private class SelectionClickListener implements View.OnClickListener {
private VH holder;

private SelectionClickListener(VH viewHolder) {
this.holder = viewHolder;
}

@Override
public void onClick(View v) {
int position = holder.getAdapterPosition() - itemStartPosition;
if (enabledSelection && (isSelectionStarted || isSingleClickSelection)) {
if (selectedItems.contains(getItem(position))) {
onSelectionListener.onUnSelected(holder, position);
if (selectedItems.isEmpty()) {
onSelectionListener.onSelectionEnd();
}
} else {
onSelectionListener.onSelected(holder, position);
}
}
if (onItemClickListener != null)
onItemClickListener.onClick(v, position);
}
}


public abstract class ViewHolder extends RecyclerView.ViewHolder {

@SuppressWarnings("unchecked")
ViewHolder(View view) {
super(view);

view.setOnClickListener(new SelectionClickListener((VH) this));
view.setOnLongClickListener(new SelectionLongClickListener((VH) this));
}
}
}

0 comments on commit b4f22eb

Please sign in to comment.