package com.codeest.geeknews.ui.zhihu.adapter; import android.content.Context; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; import android.support.v7.util.DiffUtil; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.codeest.geeknews.R; import com.codeest.geeknews.component.ImageLoader; import com.codeest.geeknews.model.bean.DailyBeforeListBean; import com.codeest.geeknews.model.bean.DailyListBean; import com.codeest.geeknews.widget.SquareImageView; import com.codeest.geeknews.widget.ZhihuDiffCallback; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; /** * Created by codeest on 16/8/13. * * 一开始打算用ScrollView嵌套RecyclerView来实现 * 但是RecyclerView23.1.1之后的版本嵌套会显示不全 * Google也不推荐ScrollView嵌套RecyclerView * 还是采取getItemViewType来实现 */ public class DailyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ private List<DailyListBean.StoriesBean> mList; private List<DailyListBean.TopStoriesBean> mTopList; private LayoutInflater inflater; private Context mContext; private TopPagerAdapter mAdapter; private ViewPager topViewPager; private OnItemClickListener onItemClickListener; private boolean isBefore = false; private String currentTitle = "今日热闻"; public enum ITEM_TYPE { ITEM_TOP, //滚动栏 ITEM_DATE, //日期 ITEM_CONTENT //内容 } public DailyAdapter(Context mContext, List<DailyListBean.StoriesBean> mList) { this.mList = mList; this.mContext = mContext; inflater = LayoutInflater.from(mContext); } @Override public int getItemViewType(int position) { if(!isBefore) { if(position == 0) { return ITEM_TYPE.ITEM_TOP.ordinal(); } else if(position == 1) { return ITEM_TYPE.ITEM_DATE.ordinal(); } else { return ITEM_TYPE.ITEM_CONTENT.ordinal(); } } else { if(position == 0) { return ITEM_TYPE.ITEM_DATE.ordinal(); } else { return ITEM_TYPE.ITEM_CONTENT.ordinal(); } } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(viewType == ITEM_TYPE.ITEM_TOP.ordinal()) { mAdapter = new TopPagerAdapter(mContext,mTopList); return new TopViewHolder(inflater.inflate(R.layout.item_top, parent, false)); } else if(viewType == ITEM_TYPE.ITEM_DATE.ordinal()) { return new DateViewHolder(inflater.inflate(R.layout.item_date, parent, false)); } return new ContentViewHolder(inflater.inflate(R.layout.item_daily, parent, false)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof ContentViewHolder) { final int contentPosition; if(isBefore) { contentPosition = position - 1; } else { contentPosition = position - 2; } ((ContentViewHolder)holder).title.setText(mList.get(contentPosition).getTitle()); if (mList.get(contentPosition).getReadState()) { ((ContentViewHolder)holder).title.setTextColor(ContextCompat.getColor(mContext,R.color.news_read)); } else { ((ContentViewHolder)holder).title.setTextColor(ContextCompat.getColor(mContext,R.color.news_unread)); } ImageLoader.load(mContext,mList.get(contentPosition).getImages().get(0),((ContentViewHolder)holder).image); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(onItemClickListener != null) { ImageView iv = (ImageView) view.findViewById(R.id.iv_daily_item_image); onItemClickListener.onItemClick(contentPosition,iv); } } }); } else if (holder instanceof DateViewHolder) { ((DateViewHolder) holder).tvDate.setText(currentTitle); } else { ((TopViewHolder) holder).vpTop.setAdapter(mAdapter); topViewPager = ((TopViewHolder) holder).vpTop; } } @Override public int getItemCount() { return mList.size(); } public static class ContentViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.tv_daily_item_title) TextView title; @BindView(R.id.iv_daily_item_image) SquareImageView image; public ContentViewHolder(View itemView) { super(itemView); ButterKnife.bind(this,itemView); } } public static class DateViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.tv_daily_date) TextView tvDate; public DateViewHolder(View itemView) { super(itemView); ButterKnife.bind(this,itemView); } } public static class TopViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.vp_top) ViewPager vpTop; @BindView(R.id.ll_point_container) LinearLayout llContainer; public TopViewHolder(View itemView) { super(itemView); ButterKnife.bind(this,itemView); } } public void addDailyDate(DailyListBean info) { currentTitle = "今日热闻"; DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new ZhihuDiffCallback(mList, info.getStories()), true); mList = info.getStories(); mTopList = info.getTop_stories(); isBefore = false; diffResult.dispatchUpdatesTo(this); // notifyDataSetChanged(); } public void addDailyBeforeDate(DailyBeforeListBean info) { currentTitle = info.getDate(); DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new ZhihuDiffCallback(mList, info.getStories()), true); mList = info.getStories(); isBefore = true; diffResult.dispatchUpdatesTo(this); // notifyDataSetChanged(); } public boolean getIsBefore() { return isBefore; } public void setReadState(int position,boolean readState) { mList.get(position).setReadState(readState); } public void changeTopPager(int currentCount) { if(!isBefore && topViewPager != null) { topViewPager.setCurrentItem(currentCount); } } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public interface OnItemClickListener { void onItemClick(int position,View view); } }