RecyclerView万能适配器(多布局、header、footer)
2017-10-24 17:36
911 查看
看到这种界面,能想到的就是做一个RecyclerView万能适配器。
万能适配需要做 头部、尾部、多布局。
首先制作3个RecyclerView:
1.VerticalRecyclerView:
public class VerticalRecyclerView extends RecyclerView { public VerticalRecyclerView(Context context) { this(context, null); } public VerticalRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); setOverScrollMode(OVER_SCROLL_NEVER); } @Override public void setAdapter(Adapter adapter) { super.setAdapter(adapter); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext()); setLayoutManager(linearLayoutManager); } }
2.HorizontalRecyclerView :
public class HorizontalRecyclerView extends RecyclerView { public HorizontalRecyclerView(Context context) { this(context, null); } public HorizontalRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); setOverScrollMode(OVER_SCROLL_NEVER); } @Override public void setAdapter(Adapter adapter) { super.setAdapter(adapter); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext()); linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); setLayoutManager(linearLayoutManager); } }
3.GridRecyclerView:
public class GridRecyclerView extends RecyclerView { private Context context; public GridRecyclerView(Context context) { this(context, null); } public GridRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); this.context=context; setOverScrollMode(OVER_SCROLL_NEVER); } public void setAdapter(Adapter adapter, int spanCount,int orientation) { LayoutManager layoutManager = new StaggeredGridLayoutManager(spanCount, orientation); setLayoutManager(layoutManager); setAdapter(adapter); } public void setAdapterAddHead( Adapter adapter, int spanCount,int orientation){ setAdapter(adapter); //初始化布局管理器 final GridLayoutManager lm = new GridLayoutManager(context,spanCount,orientation,false); /* *设置SpanSizeLookup,它将决定view会横跨多少列。这个方法是为RecyclerView添加Header和Footer的关键。 *当判断position指向的View为Header或者Footer时候,返回总列数( lm.getSpanCount()),即可让其独占一行。 */ lm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return position==0? lm.getSpanCount():1; } }); //设置布局管理器 setLayoutManager(lm); } }
万能适配器:
public abstract class RVAdapter<T> extends RecyclerView.Adapter<RVAdapter.MyViewHolder> { private List<T> list_bean;//数据 private boolean haveHeadView = false;//是否需要头部 private boolean haveFootView = false;//是否需要尾部 private int selectedPosition = 0; //默认选中位置 private int lastSelectedPosition = 0; //上次选中位置 //带headview或者选中效果的 public RVAdapter(List<T> list_bean, boolean haveHeadView) { this.list_bean = list_bean; this.haveHeadView = haveHeadView; if (haveHeadView) { selectedPosition = 1; lastSelectedPosition = 1; } } public RVAdapter(List<T> list_bean, boolean haveHeadView, boolean haveFootView) { this.haveFootView = haveFootView; this.haveHeadView = haveHeadView; this.list_bean = list_bean; if (haveHeadView) { selectedPosition = 1; lastSelectedPosition = 1; } } //普通的 public RVAdapter(List<T> list) { this.list_bean = list; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //根据viewType选择布局,实现多布局 return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(getItemLayoutID(viewType), parent, false)); } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { //添加Item的点击事件 holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (haveHeadView) { if (position == 0) { onItemHeadClick(); return; } if (haveFootView) { if (position == getItemCount() - 1) { onItemFootClick(); return; } } } else { if (haveFootView) { if (position == getItemCount() - 1) { onItemFootClick(); return; } } } if (haveHeadView){ onItemClick(position,list_bean.get(position-1)); }else { onItemClick(position,list_bean.get(position)); } if (lastSelectedPosition == position) { return; } selectedPosition = position; //选择的position赋值给参数, notifyItemChanged(selectedPosition); notifyItemChanged(lastSelectedPosition); lastSelectedPosition = position; } }); //长按事件 // holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { // @Override // public boolean onLongClick(View v) { // if (position == 0) { // onItemHeadLongClick(); // } else { // if (position == getItemCount() - 1) { // onItemFootLongClick(); // } else { // // onItemLongClick(position); // } // // } // return false; // } // }); //有头部 if (haveHeadView) { if (position == 0) { if (list_bean.size()>0){ bindDataToHeadVie 149a9 w(holder); } return; } if (haveFootView) { if (position == getItemCount() - 1) { bindDataToFootView(holder); return; } } if (position == selectedPosition) { bindDataToView(holder, position - 1,list_bean.get(position-1), true); } else { bindDataToView(holder, position - 1, list_bean.get(position-1),false); } } else { if (haveFootView) { if (position == getItemCount() - 1) { bindDataToFootView(holder); return; } } if (position == selectedPosition) { bindDataToView(holder, position,list_bean.get(position), true); } else { bindDataToView(holder, position,list_bean.get(position), false); } } } //填充数据 public abstract void bindDataToView(MyViewHolder holder, int position,T bean, boolean isSelected); //添加头部 public void bindDataToHeadView(MyViewHolder holder) { } //添加尾部 public void bindDataToFootView(MyViewHolder holder) { } @Override public int getItemCount() { if (haveHeadView) { if (haveFootView) { return list_bean.size() + 2; } return list_bean.size() + 1; } if (haveFootView) { return list_bean.size() + 1; } return list_bean.size(); } /* 取得ItemView的布局文件 @return */ public abstract int getItemLayoutID(int viewType); @Override public abstract int getItemViewType(int position); /* ItemView的单击事件 @param position */ public abstract void onItemClick(int position,T bean); public void onItemHeadClick() { } public void onItemFootClick() { } public void onItemLongClick(int position) { } public void onItemHeadLongClick() { } public void onItemFootLongClick() { } public void remove(int position){ list_bean.remove(position); notifyDataSetChanged(); } public void add(T bean) { list_bean.add(bean); notifyDataSetChanged(); } public void addNoNotify(T bean) { list_bean.add(bean); } public void addToHead(T bean) { list_bean.add(0, bean); notifyDataSetChanged(); } public int addAll(List<T> beans) { list_bean.addAll(beans); notifyDataSetChanged(); return beans.size(); } public void addAll(Collection<T> c){ list_bean.addAll(c); notifyDataSetChanged(); } public void clearAddAll(List<T> beans) { list_bean.clear(); list_bean.addAll(beans); notifyDataSetChanged(); } public void addAllToHead(List<T> beans) { list_bean.addAll(0, beans); notifyDataSetChanged(); } public void clear() { list_bean.clear(); notifyDataSetChanged(); } public static class MyViewHolder extends RecyclerView.ViewHolder { private SparseArray<View> array_view; public MyViewHolder(View itemView) { super(itemView); array_view = new SparseArray<View>(); } public <T extends View> T getView(int viewId) { View view = array_view.get(viewId); if (view == null) { view = itemView.findViewById(viewId); array_view.put(viewId, view); } return (T) view; } public MyViewHolder setVisible(int res_id) { getView(res_id).setVisibility(View.VISIBLE); return this; } public MyViewHolder setInVisible(int res_id) { getView(res_id).setVisibility(View.INVISIBLE); return this; } public void setViewGone(int res_id) { getView(res_id).setVisibility(View.GONE); } public void setViewVisible(int res_id) { getView(res_id).setVisibility(View.VISIBLE); } public void setText(int tv_id, String text) { TextView tv = getView(tv_id); tv.setText(text); } public void setPriceText(int tv_id, String text) { TextView tv = getView(tv_id); tv.setText("¥"+text); } public void setCountText(int tv_id, String text) { TextView tv = getView(tv_id); tv.setText("x"+text); } public void setCountText(int tv_id, int text) { TextView tv = getView(tv_id); tv.setText("x"+text); } public void setPriceText(int tv_id, int text) { TextView tv = getView(tv_id); tv.setText("¥"+text); } public void setPriceText(int tv_id, float text) { TextView tv = getView(tv_id); tv.setText("¥"+text); } public void setText(int tv_id, int text) { TextView tv = getView(tv_id); tv.setText(String.valueOf(text)); } public void setTextColor(int tv_id, int color) { TextView tv = getView(tv_id); tv.setTextColor(color); } public String getTVText(int tv_id) { TextView tv = getView(tv_id); return tv.getText().toString().trim(); } public String getETText(int tv_id) { EditText tv = getView(tv_id); return tv.getText().toString().trim(); } public void setBackgroundResource(int v_id, int resid) { View view = getView(v_id); view.setBackgroundResource(resid); } public void setImage(Context context, int iv_id, String url, int width,int height,int default_res) { ImageView iv = getView(iv_id); GlideUtils.loadImageByGlide(context, url, iv, width,height); } public void setImage(Context context, int iv_id, String url,int default_res) { ImageView iv = getView(iv_id); GlideUtils.loadImageByGlide(context, url, iv); } public void setImage(Context context, int iv_id, String url, int width,int height) { ImageView iv = getView(iv_id); GlideUtils.loadImageByGlide(context, url, iv, width,height); } public void setProgress( int progress_id,int progress) { ProgressBar progressBar=getView(progress_id); progressBar.setProgress(progress); } public void setOnClickListener(int res_id, View.OnClickListener onClickListener) { getView(res_id).setOnClickListener(onClickListener); } public void setOnLongClickListener(int res_id, View.OnLongClickListener onLongClickListener) { getView(res_id).setOnLongClickListener(onLongClickListener); } } }
使用方法:
rvAdapter = new RVAdapter<ActiveBean.ListBean.GoodsModuleBean>(list_bean, true) { @Override public void bindDataToHeadView(MyViewHolder holder) { super.bindDataToHeadView(holder); if (activeScekillBean==null){ return; } ActiveScekillBean.ActivityBean activityBean = activeScekillBean.getActivity(); holder.getView(layout_miaosha).setOnClickListener(ActiveAreaFragment.this); tv_miaosha_changci = holder.getView(R.id.tv_miaosha_changci); tv_time = holder.getView(R.id.tv_time); end_time = activityBean.getEnd_time(); if (Long.valueOf(end_time) - TimeAndAgeUtils.getCureentTimeStampLong() > 0l) { tv_miaosha_changci.setText(TimeAndAgeUtils.timeStamp2DateHour(activityBean.getStart_time()) + "点场 "); tv_time.setText(TimeAndAgeUtils.getDistance2CurrentTimeStamp(end_time)); new Thread(new Runnable() { @Override public void run() { if (!isRunning) { return; } while (Long.valueOf(end_time) - TimeAndAgeUtils.getCureentTimeStampLong() > 0l) { try { Thread.sleep(1000); handler.sendEmptyMessage(0); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } final List<ActiveScekillBean.GoodsBean> list_goods = (List<ActiveScekillBean.GoodsBean>) activeScekillBean.getGoods(); RVAdapter<ActiveScekillBean.GoodsBean> rvAdapter_miaosha = new RVAdapter<ActiveScekillBean.GoodsBean>(list_goods) { @Override public void bindDataToView(MyViewHolder holder, int position, ActiveScekillBean.GoodsBean bean, boolean isSelected) { ActiveScekillBean.GoodsBean goodsBean = list_goods.get(position); holder.setImage(getContext(), R.id.iv_logo, goodsBean.getLogo(), 300, 300); holder.setText(R.id.tv_name, goodsBean.getTitle()); holder.setText(R.id.tv_price, "¥" +goodsBean.getPrice()); holder.setText(R.id.tv_price_yuanlai, "¥"+goodsBean.getLimit_price()); } @Override public int getItemLayoutID(int viewType) { return R.layout.item_fragment_active_miaosha; } @Override public int getItemViewType(int position) { return 0; } @Override public void onItemClick(int position, ActiveScekillBean.GoodsBean bean) { } }; ((HorizontalRecyclerView) holder.getView(R.id.hrv_miaosha)).setAdapter(rvAdapter_miaosha); } @Override public void bindDataToView(MyViewHolder holder, int position, ActiveBean.ListBean.GoodsModuleBean bean, boolean isSelected) { ActiveBean.ListBean.GoodsModuleBean goodsModuleBean = list_bean.get(position); holder.setImage(getContext(), R.id.iv_banner, goodsModuleBean.getBanner().getLogo(), 300, 300); HorizontalRecyclerView hrv_center_inner = (HorizontalRecyclerView) holder.getView(R.id.hrv); final List<ActiveBean.ListBean.GoodsModuleBean.GoodsBeanX> list_goods = goodsModuleBean.getGoods(); RVAdapter<ActiveBean.ListBean.GoodsModuleBean.GoodsBeanX> rvAdapter_center_inner = new RVAdapter<ActiveBean.ListBean.GoodsModuleBean.GoodsBeanX>(list_goods) { @Override public void bindDataToView(MyViewHolder holder, int position, ActiveBean.ListBean.GoodsModuleBean.GoodsBeanX bean, boolean isSelected) { ActiveBean.ListBean.GoodsModuleBean.GoodsBeanX goodsBeanX = list_goods.get(position); holder.setImage(getContext(), R.id.iv_logo, goodsBeanX.getLogo(), 300, 300); holder.setText(R.id.tv_name, goodsBeanX.getTitle()); holder.setText(R.id.tv_price, "¥" + goodsBeanX.getPrice()); } @Override public int getItemLayoutID(int viewType) { return R.layout.item_fragment_active_center_inner_hrv; } @Override public int getItemViewType(int position) { return 0; } @Override public void onItemClick(int position, ActiveBean.ListBean.GoodsModuleBean.GoodsBeanX bean) { Intent intent=new Intent(getContext(),GoodsDetailActivity.class); LogUtils.log("pos_id",list_goods.get(position).getId()); intent.putExtra(Constant.INTENT_GOODS_DETAIL_ACTIVITY,list_goods.get(position).getId()); // intent.putExtra(Constant.INTENT_GOODS_DETAIL_ACTIVITY,"1"); // startActivityForResult(intent,Constant.REQUEST_2_GOODS_DETAIL_ACTIVITY); startActivity(intent); } }; hrv_center_inner.setAdapter(rvAdapter_center_inner); } @Override public int getItemLayoutID(int viewType) { if (viewType == 0) { return R.layout.include_fragment_active_miaosha; } return R.layout.item_fragment_active_center; } @Override public int getItemViewType(int position) { if (position == 0) { return 0; } return 1; } @Override public void onItemClick(int position, ActiveBean.ListBean.GoodsModuleBean bean) { } };
参考:ListView、RecyclerView、GridView
相关文章推荐
- Android RecyclerView通用适配器,支持Header、Footer、LoadMore、EmptyView等功能
- 优雅的为RecyclerView添加头尾布局HeaderAndFooterWrapper
- RecyclerView封装——添加Header、Footer(在网格瀑布流布局中独占一行)
- RecyclerView封装——添加Header、Footer(在网格瀑布流布局中独占一行)
- 封装RecyclerView Adapter 实现可添加多个header和footer,可设置loadingView,低耦合的多种布局。
- recyclerView通用适配器,支持添加多个header和footer
- 偷懒新姿势,打造属于RecyclerView的万能适配器Adapter和ViewHolder
- RecyclerView添加Header和Footer
- 为RecyclerView的不同item项实现不同的布局(添加分类Header)
- RecyclerView系列之(1):为RecyclerView添加Header和Footer
- RecyclerView五大开源项目-解决上拉加载、下拉刷新和添加Header、Footer等问题
- iOS7之后的tableView的group布局header以及footer的section
- RecyclerView 添加 Header 和 Footer
- Android Recycler View Header Footer 下拉刷新,自动加载更多,空view,loading view
- 你必须了解的RecyclerView的五大开源项目-解决上拉加载、下拉刷新和添加Header、Footer等问题
- 你必须了解的RecyclerView的五大开源项目-解决上拉加载、下拉刷新和添加Header、Footer等问题
- 开源框架BaseRecyclerViewAdapterHelper使用——RecyclerView万能适配器
- 打造RecyclerView的万能适配器
- 万能RecyclerView 支持多viewholder适配器,从重复中解脱出来!
- 详解自主实现RecyclerView下拉刷新、上拉加载、Header、Footer以及swiperefreshlayout的部分讲解