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

Commit b4f22eb

Browse files
committed
fix: avoid creating listeners on each bind
1 parent 1e68f6e commit b4f22eb

File tree

2 files changed

+129
-91
lines changed

2 files changed

+129
-91
lines changed

filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/FileGalleryAdapter.java

Lines changed: 65 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import androidx.recyclerview.widget.AsyncDifferConfig;
3535
import androidx.recyclerview.widget.DiffUtil;
3636
import androidx.recyclerview.widget.ListUpdateCallback;
37-
import androidx.recyclerview.widget.RecyclerView;
3837

3938
import com.bumptech.glide.Glide;
4039
import com.bumptech.glide.RequestManager;
@@ -118,73 +117,30 @@ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
118117
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
119118
if (showCamera) {
120119
if (position == 0) {
121-
handleCamera(holder.openCamera, false);
120+
holder.bind(null, false);
122121
return;
123122
}
124123
if (showVideoCamera) {
125124
if (position == 1) {
126-
handleCamera(holder.openVideoCamera, true);
125+
holder.bind(null, true);
127126
return;
128127
}
129-
holder.openVideoCamera.setVisibility(View.GONE);
130128
position--;
131129
}
132-
holder.openCamera.setVisibility(View.GONE);
133130
position--;
134131
} else if (showVideoCamera) {
135132
if (position == 0) {
136-
handleCamera(holder.openVideoCamera, true);
133+
holder.bind(null, true);
137134
return;
138135
}
139-
holder.openVideoCamera.setVisibility(View.GONE);
140136
position--;
141137
}
142138

143139
super.onBindViewHolder(holder, position);
144140

145141
MediaFile mediaFile = getItem(position);
146142

147-
if (mediaFile.getMediaType() == MediaFile.TYPE_VIDEO ||
148-
mediaFile.getMediaType() == MediaFile.TYPE_IMAGE) {
149-
glideRequest.load(mediaFile.getUri())
150-
.into(holder.fileThumbnail);
151-
} else if (mediaFile.getMediaType() == MediaFile.TYPE_AUDIO) {
152-
glideRequest.load(mediaFile.getThumbnail())
153-
.apply(RequestOptions.placeholderOf(R.drawable.ic_audio))
154-
.into(holder.fileThumbnail);
155-
} else {
156-
holder.fileThumbnail.setImageResource(R.drawable.ic_file);
157-
}
158-
159-
if (mediaFile.getMediaType() == MediaFile.TYPE_VIDEO ||
160-
mediaFile.getMediaType() == MediaFile.TYPE_AUDIO) {
161-
holder.fileDuration.setVisibility(View.VISIBLE);
162-
holder.fileDuration.setText(TimeUtils.getDuration(mediaFile.getDuration()));
163-
} else {
164-
holder.fileDuration.setVisibility(View.GONE);
165-
}
166-
167-
if (mediaFile.getMediaType() == MediaFile.TYPE_FILE
168-
|| mediaFile.getMediaType() == MediaFile.TYPE_AUDIO) {
169-
holder.fileName.setVisibility(View.VISIBLE);
170-
holder.fileName.setText(mediaFile.getName());
171-
} else {
172-
holder.fileName.setVisibility(View.GONE);
173-
}
174-
175-
holder.fileSelected.setVisibility(isSelected(mediaFile) ? View.VISIBLE : View.GONE);
176-
}
177-
178-
private void handleCamera(final ImageView openCamera, final boolean forVideo) {
179-
openCamera.setVisibility(View.VISIBLE);
180-
openCamera.setOnClickListener(new View.OnClickListener() {
181-
@Override
182-
public void onClick(View v) {
183-
if (onCameraClickListener != null && !onCameraClickListener.onCameraClick(forVideo))
184-
return;
185-
openCamera(forVideo);
186-
}
187-
});
143+
holder.bind(mediaFile, null);
188144
}
189145

190146
public void openCamera(boolean forVideo) {
@@ -300,7 +256,7 @@ public void onMaxReached() {
300256
}
301257
}
302258

303-
public static class ViewHolder extends RecyclerView.ViewHolder {
259+
public class ViewHolder extends MultiSelectionAdapter.ViewHolder {
304260
private ImageView fileSelected, openCamera, openVideoCamera;
305261
private SquareImage fileThumbnail;
306262
private TextView fileDuration, fileName;
@@ -313,6 +269,66 @@ public static class ViewHolder extends RecyclerView.ViewHolder {
313269
fileDuration = v.findViewById(R.id.file_duration);
314270
fileName = v.findViewById(R.id.file_name);
315271
fileSelected = v.findViewById(R.id.file_selected);
272+
273+
openCamera.setOnClickListener(new View.OnClickListener() {
274+
@Override
275+
public void onClick(View v) {
276+
if (onCameraClickListener != null && !onCameraClickListener.onCameraClick(false))
277+
return;
278+
openCamera(false);
279+
}
280+
});
281+
282+
openVideoCamera.setOnClickListener(new View.OnClickListener() {
283+
@Override
284+
public void onClick(View v) {
285+
if (onCameraClickListener != null && !onCameraClickListener.onCameraClick(true))
286+
return;
287+
openCamera(true);
288+
}
289+
});
290+
}
291+
292+
void bind(MediaFile mediaFile, Boolean forVideo) {
293+
if (forVideo == null) {
294+
openCamera.setVisibility(View.GONE);
295+
openVideoCamera.setVisibility(View.GONE);
296+
} else {
297+
openCamera.setVisibility(forVideo ? View.GONE : View.VISIBLE);
298+
openVideoCamera.setVisibility(forVideo ? View.VISIBLE : View.GONE);
299+
}
300+
301+
if (mediaFile == null) return;
302+
303+
if (mediaFile.getMediaType() == MediaFile.TYPE_VIDEO ||
304+
mediaFile.getMediaType() == MediaFile.TYPE_IMAGE) {
305+
glideRequest.load(mediaFile.getUri())
306+
.into(fileThumbnail);
307+
} else if (mediaFile.getMediaType() == MediaFile.TYPE_AUDIO) {
308+
glideRequest.load(mediaFile.getThumbnail())
309+
.apply(RequestOptions.placeholderOf(R.drawable.ic_audio))
310+
.into(fileThumbnail);
311+
} else {
312+
fileThumbnail.setImageResource(R.drawable.ic_file);
313+
}
314+
315+
if (mediaFile.getMediaType() == MediaFile.TYPE_VIDEO ||
316+
mediaFile.getMediaType() == MediaFile.TYPE_AUDIO) {
317+
fileDuration.setVisibility(View.VISIBLE);
318+
fileDuration.setText(TimeUtils.getDuration(mediaFile.getDuration()));
319+
} else {
320+
fileDuration.setVisibility(View.GONE);
321+
}
322+
323+
if (mediaFile.getMediaType() == MediaFile.TYPE_FILE
324+
|| mediaFile.getMediaType() == MediaFile.TYPE_AUDIO) {
325+
fileName.setVisibility(View.VISIBLE);
326+
fileName.setText(mediaFile.getName());
327+
} else {
328+
fileName.setVisibility(View.GONE);
329+
}
330+
331+
fileSelected.setVisibility(isSelected(mediaFile) ? View.VISIBLE : View.GONE);
316332
}
317333
}
318334

filepicker/src/main/java/com/jaiselrahman/filepicker/adapter/MultiSelectionAdapter.java

Lines changed: 64 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import java.util.List;
3030

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

@@ -146,47 +146,7 @@ public int getItemCount() {
146146
@CallSuper
147147
@Override
148148
public void onBindViewHolder(@NonNull final VH holder, int position) {
149-
final View view = holder.itemView;
150-
151-
view.setOnClickListener(new View.OnClickListener() {
152-
@Override
153-
public void onClick(View v) {
154-
int position = holder.getAdapterPosition() - itemStartPosition;
155-
if (enabledSelection && (isSelectionStarted || isSingleClickSelection)) {
156-
if (selectedItems.contains(getItem(position))) {
157-
onSelectionListener.onUnSelected(holder, position);
158-
if (selectedItems.isEmpty()) {
159-
onSelectionListener.onSelectionEnd();
160-
}
161-
} else {
162-
onSelectionListener.onSelected(holder, position);
163-
}
164-
}
165-
if (onItemClickListener != null)
166-
onItemClickListener.onClick(v, position);
167-
}
168-
});
169-
170-
setItemSelected(view, position, selectedItems.contains(getItem(position)));
171-
172-
view.setOnLongClickListener(new View.OnLongClickListener() {
173-
@Override
174-
public boolean onLongClick(View v) {
175-
int position = holder.getAdapterPosition() - itemStartPosition;
176-
if (enabledSelection) {
177-
if (!isSelectionStarted) {
178-
onSelectionListener.onSelectionBegin();
179-
onSelectionListener.onSelected(holder, position);
180-
} else if (selectedItems.size() <= 1
181-
&& selectedItems.contains(getItem(position))) {
182-
onSelectionListener.onSelectionEnd();
183-
onSelectionListener.onUnSelected(holder, position);
184-
}
185-
}
186-
return onItemLongClickListener == null ||
187-
onItemLongClickListener.onLongClick(view, position);
188-
}
189-
});
149+
setItemSelected(holder.itemView, position, selectedItems.contains(getItem(position)));
190150
}
191151

192152
@Override
@@ -322,4 +282,66 @@ public interface OnSelectionListener<VH> {
322282

323283
void onMaxReached();
324284
}
285+
286+
private class SelectionLongClickListener implements View.OnLongClickListener {
287+
private VH holder;
288+
289+
private SelectionLongClickListener(VH viewHolder) {
290+
this.holder = viewHolder;
291+
}
292+
293+
@Override
294+
public boolean onLongClick(View v) {
295+
int position = holder.getAdapterPosition() - itemStartPosition;
296+
if (enabledSelection) {
297+
if (!isSelectionStarted) {
298+
onSelectionListener.onSelectionBegin();
299+
onSelectionListener.onSelected(holder, position);
300+
} else if (selectedItems.size() <= 1
301+
&& selectedItems.contains(getItem(position))) {
302+
onSelectionListener.onSelectionEnd();
303+
onSelectionListener.onUnSelected(holder, position);
304+
}
305+
}
306+
return onItemLongClickListener == null ||
307+
onItemLongClickListener.onLongClick(holder.itemView, position);
308+
}
309+
}
310+
311+
private class SelectionClickListener implements View.OnClickListener {
312+
private VH holder;
313+
314+
private SelectionClickListener(VH viewHolder) {
315+
this.holder = viewHolder;
316+
}
317+
318+
@Override
319+
public void onClick(View v) {
320+
int position = holder.getAdapterPosition() - itemStartPosition;
321+
if (enabledSelection && (isSelectionStarted || isSingleClickSelection)) {
322+
if (selectedItems.contains(getItem(position))) {
323+
onSelectionListener.onUnSelected(holder, position);
324+
if (selectedItems.isEmpty()) {
325+
onSelectionListener.onSelectionEnd();
326+
}
327+
} else {
328+
onSelectionListener.onSelected(holder, position);
329+
}
330+
}
331+
if (onItemClickListener != null)
332+
onItemClickListener.onClick(v, position);
333+
}
334+
}
335+
336+
337+
public abstract class ViewHolder extends RecyclerView.ViewHolder {
338+
339+
@SuppressWarnings("unchecked")
340+
ViewHolder(View view) {
341+
super(view);
342+
343+
view.setOnClickListener(new SelectionClickListener((VH) this));
344+
view.setOnLongClickListener(new SelectionLongClickListener((VH) this));
345+
}
346+
}
325347
}

0 commit comments

Comments
 (0)