1、BaseAdapter
import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import java.util.List; /** * Created by wnw on 16-5-20. */ public abstract class HeaderBaseAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public static final int TYPE_HEADER = -99; //说明是带有Header的 public static final int TYPE_FOOTER = 99; //说明是带有Footer的 public static final int TYPE_NORMAL = 0; //说明是不带有header和footer的 //获取从Activity中传递过来每个item的数据集合 private List<String> mDatas; //HeaderView, FooterView private View mHeaderView; private View mFooterView; public HeaderBaseAdapter(List mDatas){ this.mDatas=mDatas; } //HeaderView和FooterView的get和set函数 public View getHeaderView() { return mHeaderView; } public void setHeaderView(View headerView) { mHeaderView = headerView; notifyItemInserted(0); } public View getFooterView() { return mFooterView; } public void setFooterView(View footerView) { mFooterView = footerView; notifyItemInserted(getItemCount()-1); } /** 重写这个方法,很重要,是加入Header和Footer的关键,我们通过判断item的类型,从而绑定不同的view * */ @Override public int getItemViewType(int position) { if (mHeaderView!=null&&position==0) { //第一个item应该加载Header return TYPE_HEADER; } if (mFooterView!=null&&position == getItemCount()-1) { //最后一个,应该加载Footer return TYPE_FOOTER; } if (mHeaderView==null) return setItemViewType(position); return setItemViewType(position - 1); } //创建View,如果是HeaderView或者是FooterView,直接在Holder中返回 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(mHeaderView != null && viewType == TYPE_HEADER) { return new ListHolder(mHeaderView); } if(mFooterView != null && viewType == TYPE_FOOTER){ return new ListHolder(mFooterView); } // View layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); // return new ListHolder(layout); return setViewHolder(parent,viewType); } //绑定View,这里是根据返回的这个position的类型,从而进行绑定的, HeaderView和FooterView, 就不同绑定了 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (getItemViewType(position) == TYPE_HEADER) { return; } else if (getItemViewType(position) == TYPE_FOOTER) { return; }else{ if(holder instanceof ListHolder) { //这里加载数据的时候要注意,是从position-1开始,因为position==0已经被header占用了 // ((ListHolder) holder).tv.setText(mDatas.get(position-1)); if (mHeaderView==null) bindListHolder((ListHolder) holder, position); bindListHolder((ListHolder) holder, position-1); } return; } } //在这里面加载ListView中的每个item的布局 class ListHolder extends RecyclerView.ViewHolder{ public ListHolder(View itemView) { super(itemView); //如果是headerview或者是footerview,直接返回 if (itemView == mHeaderView){ return; } if (itemView == mFooterView){ return; } } } //返回View中Item的个数,这个时候,总的个数应该是ListView中Item的个数加上HeaderView和FooterView @Override public int getItemCount() { int size=mDatas==null?0:mDatas.size(); if(mHeaderView == null && mFooterView == null){ return size; }else if(mHeaderView == null && mFooterView != null){ return size + 1; }else if (mHeaderView != null && mFooterView == null){ return size + 1; }else { return size + 2; }2、Adapter}/*********************************************************** * 如果mHeaderView!=null 则: * * 1、把position作为参数去取值的时候,position = position+1;* * 2、通过方法获取当前position的时候,position = result-1; * ***********************************************************/ public int getRealPosition(ListHolder holder) { int position = holder.getLayoutPosition(); return mHeaderView == null ? position : position - 1; }public abstract int setItemViewType(int position); public abstract ListHolder setViewHolder(ViewGroup parent, int viewType); public abstract void bindListHolder(ListHolder holder, int position);}
import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.mediacenter.bipai.R; import com.mediacenter.bipai.model.AudioPlayerBean; import com.mediacenter.bipai.model.HomeStatusDetailModel; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2016/9/29. */ public class MyAdapter extends HeaderBaseAdapter { private Context context; private LayoutInflater mLayoutInflater; private List<HomeStatusDetailModel.DataBean.PicBean> pic; private final int TYPE_TEXT = 1; private final int TYPE_PIC = 2; private final int TYPE_VIDEO = 3; private final int TYPE_AUDIO = 4; private final int TYPE_LIVE = 5; private RecyclerView recyclerView; // private Map<Integer,MediaPlayer> playerMap; // private Map<Integer,AudioPlayerBean> playerBeanMap; List<AudioPlayerBean> playerBeanMap; public MyAdapter(Context context, List pic){ super(pic); this.context = context; this.pic = pic; mLayoutInflater = LayoutInflater.from(context); playerBeanMap = new ArrayList<>(); // player.setAudioStreamType(AudioManager.STREAM_MUSIC); } public void setData(List<HomeStatusDetailModel.DataBean.PicBean> pic){ this.pic = pic; notifyDataSetChanged(); } @Override public int setItemViewType(int position) { switch (pic.get(position).getType()) { case "TXT": case "txt": return TYPE_TEXT; case "PIC": case "pic": return TYPE_PIC; case "VIDEO": case "video": return TYPE_VIDEO; case "AUDIO": case "audio": return TYPE_AUDIO; case "LIVE": case "live": return TYPE_LIVE; } return -1; } @Override public ListHolder setViewHolder(ViewGroup parent, int viewTpe) { recyclerView = (RecyclerView) parent; mLayoutInflater = LayoutInflater.from(context); switch (viewTpe) { case TYPE_TEXT: return new Item1ViewHolder(mLayoutInflater.inflate(R.layout.item_statusdetail_txt, parent, false)); case TYPE_PIC: return new Item2ViewHolder(mLayoutInflater.inflate(R.layout.item_statusdetail_pic, parent, false)); case TYPE_AUDIO: return new Item4ViewHolder(mLayoutInflater.inflate(R.layout.item_statusdetail_audio, parent, false)); case TYPE_LIVE: return new Item3ViewHolder(mLayoutInflater.inflate(R.layout.item_statusdetail_live, parent, false)); case TYPE_VIDEO: return new Item5ViewHolder(mLayoutInflater.inflate(R.layout.item_statusdetail_video, parent, false)); default: return null; } } @Override public void bindListHolder(ListHolder holder, final int position) { final HomeStatusDetailModel.DataBean.PicBean picBean = pic.get(position); final String value = picBean.getValue(); final String cover_url = picBean.getCover_url(); final int status = picBean.getStatus(); if (holder instanceof Item1ViewHolder) { // ((Item1ViewHolder) holder).tv1.setText(value); } else if (holder instanceof Item2ViewHolder) { final Item2ViewHolder finalHolder = (Item2ViewHolder) holder; } else if (holder instanceof Item4ViewHolder) { final Item4ViewHolder finalHolder = (Item4ViewHolder) holder; } else if (holder instanceof Item3ViewHolder) { final Item3ViewHolder finalHolder = (Item3ViewHolder) holder; } else if (holder instanceof Item5ViewHolder) { final Item5ViewHolder finalHolder = (Item5ViewHolder) holder; } } public class Item1ViewHolder extends ListHolder { public Item1ViewHolder(View itemView) { super(itemView); } } //pic 的ViewHolder public class Item2ViewHolder extends ListHolder { public Item2ViewHolder(View itemView) { super(itemView); } } public class Item3ViewHolder extends ListHolder{ public Item3ViewHolder(View itemView) { super(itemView); } } //pic 的ViewHolder public class Item4ViewHolder extends ListHolder { public Item4ViewHolder(View itemView) { super(itemView); } } //视频 public class Item5ViewHolder extends ListHolder{ public Item5ViewHolder(View itemView) { super(itemView); } } }3、Activity中:
headViewLayout = (RelativeLayout) LayoutInflater.from(context).inflate(R.layout.status_headview, null); footViewLayout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.status_footview, null);
recycleview.setAdapter(adapter); adapter.setHeaderView(headViewLayout); adapter.setFooterView(footViewLayout);