package com.alexvasilkov.gestures.sample.ex.list.complex; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.alexvasilkov.android.commons.ui.Views; import com.alexvasilkov.gestures.sample.R; import com.alexvasilkov.gestures.sample.ex.utils.GlideHelper; import com.alexvasilkov.gestures.sample.ex.utils.Painting; import java.util.List; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView.ViewHolder; class ListAdapter extends RecyclerView.Adapter<ViewHolder> { private static final int TYPE_IMAGES = 0; private static final int TYPE_TEXT = 1; private final List<ListItem> items; private final OnImageClickListener listener; ListAdapter(List<ListItem> items, OnImageClickListener listener) { this.items = items; this.listener = listener; } @Override public int getItemCount() { return items.size(); } @Override public int getItemViewType(int position) { return items.get(position).paintings == null ? TYPE_TEXT : TYPE_IMAGES; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case TYPE_IMAGES: final ImagesViewHolder holder = new ImagesViewHolder(parent); // Setting up click listeners and saving images positions into tags for (int i = 0, size = holder.images.length; i < size; i++) { holder.images[i].setTag(R.id.tag_item, i); holder.images[i].setOnClickListener(this::onImageClick); } return holder; case TYPE_TEXT: return new TextViewHolder(parent); default: throw new IllegalArgumentException(); } } @Override public void onBindViewHolder(ViewHolder holder, int position) { if (holder instanceof ImagesViewHolder) { onBindImages((ImagesViewHolder) holder, items.get(position), position); } else if (holder instanceof TextViewHolder) { onBindText((TextViewHolder) holder, items.get(position)); } } private void onBindImages(ImagesViewHolder holder, ListItem item, int pos) { // Computing number of hidden images, starting with no visible images int hidden = item.paintings == null ? 0 : item.paintings.size(); // Going through all available image views for (int i = 0, size = holder.images.length; i < size; i++) { // Getting painting for current position (if there is one) final Painting painting = item.paintings != null && i < item.paintings.size() ? item.paintings.get(i) : null; if (painting == null) { // No more paintings, hiding current image holder.images[i].setVisibility(View.GONE); } else { // Showing painting's image for current position holder.images[i].setVisibility(View.VISIBLE); GlideHelper.loadThumb(holder.images[i], painting.thumbId); hidden--; } } // Displaying number of hidden paintings, if any final String countText = "+" + hidden; holder.count.setText(countText); holder.count.setVisibility(hidden > 0 ? View.VISIBLE : View.GONE); holder.row.setTag(R.id.tag_item, pos); } private void onBindText(TextViewHolder holder, ListItem item) { holder.text.setText(item.text); } private void onImageClick(View image) { final ViewGroup parent = (ViewGroup) image.getParent(); final int itemPos = (int) parent.getTag(R.id.tag_item); final int imagePos = (int) image.getTag(R.id.tag_item); listener.onImageClick(itemPos, imagePos); } static ImageView getImageView(RecyclerView.ViewHolder holder, int pos) { if (holder instanceof ImagesViewHolder) { final ImageView[] images = ((ImagesViewHolder) holder).images; return pos >= 0 && pos < images.length ? images[pos] : null; } else { return null; } } private static class ImagesViewHolder extends ViewHolder { final ViewGroup row; final ImageView[] images = new ImageView[2]; final TextView count; ImagesViewHolder(ViewGroup parent) { super(Views.inflate(parent, R.layout.complex_list_item_images)); row = itemView.findViewById(R.id.complex_item_row); images[0] = itemView.findViewById(R.id.complex_item_image_1); images[1] = itemView.findViewById(R.id.complex_item_image_2); count = itemView.findViewById(R.id.complex_item_count); } } private static class TextViewHolder extends ViewHolder { final TextView text; TextViewHolder(ViewGroup parent) { super(Views.inflate(parent, R.layout.complex_list_item_text)); text = (TextView) itemView; } } interface OnImageClickListener { void onImageClick(int itemPos, int imagePos); } }