private class FilterAdapter extends RecyclerView.Adapter {
private static final int TYPE_FILTER = 0;
private static final int TYPE_LIVE_STREAM_FILTER = 1;
private static final int TYPE_DIVIDER = 2;
private final List mItems;
private final LayoutInflater mInflater;
FilterAdapter(TagMetadata filters) {
mInflater = LayoutInflater.from(ExploreSessionsActivity.this);
mItems = new ArrayList();
processFilters(filters);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(final ViewGroup parent,
final int viewType) {
switch (viewType) {
case TYPE_FILTER:
return createFilterViewHolder(parent);
case TYPE_LIVE_STREAM_FILTER:
return createLiveStreamFilterViewHolder(parent);
case TYPE_DIVIDER:
return createDividerViewHolder(parent);
default:
LOGE(TAG, "Unknown view type");
throw new IllegalArgumentException("Unknown view type");
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
switch (getItemViewType(position)) {
case TYPE_FILTER:
bindFilter((FilterViewHolder) holder, (TagMetadata.Tag) mItems.get(position));
break;
case TYPE_LIVE_STREAM_FILTER:
bindLiveStreamFilter((FilterViewHolder) holder);
break;
}
}
@Override
public int getItemCount() {
return mItems.size();
}
@Override
public int getItemViewType(final int position) {
Object item = mItems.get(position);
if (item instanceof LiveStream) {
return TYPE_LIVE_STREAM_FILTER;
} else if (item instanceof Divider) {
return TYPE_DIVIDER;
}
return TYPE_FILTER;
}
/**
* We transform the provided data into a structure suitable for the RecyclerView i.e. we
* build up {@link #mItems}, adding 'marker' items for dividers & live stream.
*/
private void processFilters(TagMetadata tagMetadata) {
List<TagMetadata.Tag> themes =
tagMetadata.getTagsInCategory(Config.Tags.CATEGORY_THEME);
if (themes != null && !themes.isEmpty()) {
for (TagMetadata.Tag theme : themes) {
mItems.add(theme);
}
}
mItems.add(new Divider());
List<TagMetadata.Tag> sessionTypes =
tagMetadata.getTagsInCategory(Config.Tags.CATEGORY_TYPE);
if (sessionTypes != null && !sessionTypes.isEmpty()) {
for (TagMetadata.Tag type : sessionTypes) {
mItems.add(type);
}
}
mItems.add(new Divider());
mItems.add(new LiveStream());
mItems.add(new Divider());
List<TagMetadata.Tag> topics =
tagMetadata.getTagsInCategory(Config.Tags.CATEGORY_TRACK);
if (topics != null && !topics.isEmpty()) {
for (TagMetadata.Tag topic : topics) {
mItems.add(topic);
}
}
}
private FilterViewHolder createFilterViewHolder(final ViewGroup parent) {
final FilterViewHolder holder = new FilterViewHolder(mInflater.inflate(
R.layout.explore_sessions_list_item_alt_drawer, parent, false));
holder.checkbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
final TagMetadata.Tag filter =
(TagMetadata.Tag) mItems.get(holder.getAdapterPosition());
updateFilters(filter, holder.checkbox.isChecked());
}
});
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
holder.checkbox.performClick();
}
});
return holder;
}
private FilterViewHolder createLiveStreamFilterViewHolder(final ViewGroup parent) {
final FilterViewHolder holder = new FilterViewHolder(mInflater.inflate(
R.layout.explore_sessions_list_item_livestream_alt_drawer, parent, false));
holder.checkbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
mTagFilterHolder.setShowLiveStreamedSessions(holder.checkbox.isChecked());
reloadFragment();
}
});
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
holder.checkbox.performClick();
}
});
return holder;
}
private DividerViewHolder createDividerViewHolder(final ViewGroup parent) {
// TODO we should use an ItemDecoration rather than a view
return new DividerViewHolder(mInflater.inflate(
R.layout.explore_sessions_list_item_alt_header, parent, false));
}
private void bindFilter(final FilterViewHolder holder,
final TagMetadata.Tag filter) {
holder.label.setText(filter.getName());
holder.checkbox.setChecked(mTagFilterHolder.contains(filter.getId()));
}
private void bindLiveStreamFilter(final FilterViewHolder holder) {
holder.checkbox.setChecked(mTagFilterHolder.isShowLiveStreamedSessions());
}
}
private static class Divider {}
private static class LiveStream {}
private static class FilterViewHolder extends RecyclerView.ViewHolder {
final TextView label;
final CheckBox checkbox;
public FilterViewHolder(final View itemView) {
super(itemView);
label = (TextView) itemView.findViewById(R.id.text_view);
checkbox = (CheckBox) itemView.findViewById(R.id.filter_checkbox);
}
}
private static class DividerViewHolder extends RecyclerView.ViewHolder {
public DividerViewHolder(final View itemView) {
super(itemView);
}
}
Google提供的一种RecyclerAdaper多种类型View的写法的Demo
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 1.当代种种事件不同于历史之处,在于我们不知道它们会产生什么后果。 2.经验和利益的偶然结合,往往会向人们揭示...
- 文/青砚 几年前,因为震撼于乔治.奥威尔的《一九八四》,所以囤了他的另外一本书《动物庄园》,前几天整理书柜翻看了几...