Skip to content

Instantly share code, notes, and snippets.

@PenzK
Created September 18, 2015 08:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PenzK/fd97c0461a93b83f68e0 to your computer and use it in GitHub Desktop.
Save PenzK/fd97c0461a93b83f68e0 to your computer and use it in GitHub Desktop.
Expandable Recycler Adapter
package com.autoportal.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.autoportal.R;
import com.autoportal.model.VariantDescriptionItem;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* Created by Kirill-Penzykov on 18.05.2015.
*/
public abstract class ExpandableRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
// TODO: update logic to real data types and replace fake data
public static final int HEADER_VIEW = 0;
public static final int GROUP_VIEW = 1;
public static final int ITEM_VIEW = 2;
private List<VariantDescriptionItem> headers;
private Context context;
private Map<Integer, VariantDescriptionItem> openItems = new LinkedHashMap<>();
public ExpandableRecyclerAdapter(Context context, List<VariantDescriptionItem> details) {
this.headers = details;
this.context = context;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return HEADER_VIEW;
}
if (TextUtils.isEmpty(headers.get(position).getValue())) {
return GROUP_VIEW;
} else {
return ITEM_VIEW;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
switch (viewType) {
case GROUP_VIEW:
View groupView = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_group_model_variant_detail, viewGroup, false);
GroupViewHolder groupViewHolder = new GroupViewHolder(groupView);
setGroupItemClickListener(groupViewHolder);
return groupViewHolder;
case ITEM_VIEW:
View itemView = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_model_variant_detail, viewGroup, false);
return new ItemViewHolder(itemView);
case HEADER_VIEW:
default:
View headerView = LayoutInflater.from(viewGroup.getContext())
.inflate(getHeaderLayoutResource(), viewGroup, false);
return getHeaderViewHolder(headerView);
}
}
public abstract int getHeaderLayoutResource();
public abstract RecyclerView.ViewHolder getHeaderViewHolder(View headerView);
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int viewType) {
}
private void setGroupItemClickListener(final GroupViewHolder viewHolder) {
viewHolder.groupHeaderTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = viewHolder.getLayoutPosition();
int nextPosition = position + 1;
if (!openItems.containsKey(headers.get(position).getId())) {
List<VariantDescriptionItem> subHeaders = new ArrayList<>();
subHeaders.add(new VariantDescriptionItem(99, "Safety", "Yes"));
subHeaders.add(new VariantDescriptionItem(100, "Safety", "Yes"));
subHeaders.add(new VariantDescriptionItem(101, "Safety", "Yes"));
headers.addAll(nextPosition, subHeaders);
notifyItemRangeInserted(nextPosition, subHeaders.size());
openItems.put(headers.get(position).getId(), headers.get(position));
viewHolder.dropDownImageView.setImageResource(R.drawable.ic_arrow_dropdown_common_up);
viewHolder.bottomDividerView.setVisibility(View.VISIBLE);
} else {
int removedCounter = 0;
while (nextPosition < headers.size() && !TextUtils.isEmpty(headers.get(nextPosition).getValue())) {
headers.remove(nextPosition);
removedCounter++;
}
notifyItemRangeRemoved(nextPosition, removedCounter);
openItems.remove(headers.get(position).getId());
viewHolder.dropDownImageView.setImageResource(R.drawable.ic_arrow_dropdown_common);
viewHolder.bottomDividerView.setVisibility(View.GONE);
}
}
});
}
@Override
public int getItemCount() {
return headers.size();
}
static class GroupViewHolder extends RecyclerView.ViewHolder {
@InjectView(R.id.text_view_group_header)
TextView groupHeaderTextView;
@InjectView(R.id.image_view_dropdown)
ImageView dropDownImageView;
@InjectView(R.id.view_bottom_divider)
View bottomDividerView;
public GroupViewHolder(View view) {
super(view);
ButterKnife.inject(this, view);
}
}
static class ItemViewHolder extends RecyclerView.ViewHolder {
@InjectView(R.id.text_view_item_header)
TextView itemHeaderTextView;
public ItemViewHolder(View view) {
super(view);
ButterKnife.inject(this, view);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment