package io.hefuyi.zhihudaily.ui.adapter; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.Collections; import java.util.List; import io.hefuyi.zhihudaily.R; import io.hefuyi.zhihudaily.mvp.model.DailyStories; import io.hefuyi.zhihudaily.mvp.model.Story; import io.hefuyi.zhihudaily.ui.adapter.holder.DateViewHolder; import io.hefuyi.zhihudaily.ui.adapter.holder.HeaderViewPagerHolder; import io.hefuyi.zhihudaily.ui.adapter.holder.StoryViewHolder; import io.hefuyi.zhihudaily.util.UIUtils; /** * Created by hefuyi on 16/8/4. */ public class DailyStoriesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public static final String TAG = DailyStoriesAdapter.class.getSimpleName(); private final List<Item> mItems; private final List<Item> mTmpItems; public static class Type { public static final int TYPE_HEADER = 0; public static final int TYPE_DATE = 1; public static final int TYPE_STORY = 2; } public DailyStoriesAdapter() { mItems = new ArrayList<>(); mTmpItems = new ArrayList<>(); } public void setList(DailyStories dailyStories) { mItems.clear(); appendList(dailyStories); } public void appendList(DailyStories dailyStories) { int positionStart = mItems.size(); if (positionStart == 0) { Item header = new Item(); header.setType(Type.TYPE_HEADER); header.setStories(dailyStories.getTopStories()); mItems.add(header); } Item dateItem = new Item(); dateItem.setType(Type.TYPE_DATE); dateItem.setDate(dailyStories.getDate()); mItems.add(dateItem); List<Story> stories = dailyStories.getStories(); for (Story story : stories) { Item storyItem = new Item(); storyItem.setType(Type.TYPE_STORY); storyItem.setStory(story); mItems.add(storyItem); } int itemCount = mItems.size() - positionStart; if (positionStart == 0) { notifyDataSetChanged(); }else{ notifyItemRangeChanged(positionStart, itemCount); } } @Override public void onViewDetachedFromWindow(RecyclerView.ViewHolder holder) { super.onViewDetachedFromWindow(holder); if (holder instanceof HeaderViewPagerHolder) { HeaderViewPagerHolder pagerHolder = (HeaderViewPagerHolder) holder; if (pagerHolder.isAutoScrolling()) { pagerHolder.stopAutoScroll(); } } } @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { super.onViewAttachedToWindow(holder); if (holder instanceof HeaderViewPagerHolder) { HeaderViewPagerHolder pagerHolder = (HeaderViewPagerHolder) holder; if (!pagerHolder.isAutoScrolling()) { pagerHolder.startAutoScroll(); } } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView; switch (viewType) { case Type.TYPE_HEADER: itemView = UIUtils.inflate(R.layout.recycler_header_viewpager, parent); return new HeaderViewPagerHolder(itemView, mItems.get(0).getStories()); case Type.TYPE_DATE: itemView = UIUtils.inflate(R.layout.recycler_item_date, parent); return new DateViewHolder(itemView); case Type.TYPE_STORY: itemView = UIUtils.inflate(R.layout.recycler_item_story, parent); return new StoryViewHolder(itemView); default: return null; } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { int viewType = getItemViewType(position); Item item = mItems.get(position); switch (viewType) { case Type.TYPE_HEADER: ((HeaderViewPagerHolder) holder).bindHeaderView(); break; case Type.TYPE_DATE: ((DateViewHolder) holder).bindDate(item.getDate()); break; case Type.TYPE_STORY: ((StoryViewHolder) holder).bindStoryView(item.getStory()); break; } } @Override public int getItemCount() { return mItems.size(); } @Override public int getItemViewType(int position) { return mItems.get(position).getType(); } public Item getItem(int position) { return mItems.get(position); } public String getTitleBeforePosition(int position) { mTmpItems.clear(); mTmpItems.addAll(mItems.subList(0, position + 1)); Collections.reverse(mTmpItems); for (Item item : mTmpItems) { if (item.getType() == Type.TYPE_DATE) { return item.getDate(); } } return ""; } public static class Item { private int type; private String date; private Story story; private List<Story> stories; public int getType() { return type; } public String getDate() { return date; } public Story getStory() { return story; } public List<Story> getStories() { return stories; } public void setType(int type) { this.type = type; } public void setDate(String date) { this.date = date; } public void setStory(Story story) { this.story = story; } public void setStories(List<Story> stories) { this.stories = stories; } } }