Created
September 18, 2015 08:53
-
-
Save PenzK/fd97c0461a93b83f68e0 to your computer and use it in GitHub Desktop.
Expandable Recycler Adapter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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