使用RecyclerView实现动态添加头布局,脚布局
来源:互联网 发布:spss剔除异常数据 编辑:程序博客网 时间:2024/05/22 16:49
通过重写RecyclerView.Adapter来实现添加头脚布局的功能
-----具体使用
1 创建adapter继承DBaseRecyclerViewAdapter,实现onCreateViewHolder1()方法,绑定布局
2 创建viewholder继承DBaseRecyclerViewHolder,实现setData()方法,设置页面数据
3 绑定自定义的adapter与DRecyclerViewAdapter
4 添加脚布局
5 设置adapter到recyclerView
---伪代码
MyAdapter myAdapter = new MyAdapter(this, arrayList); DRecyclerViewAdapter recyclerViewAdapter = new DRecyclerViewAdapter(myAdapter); GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3); gridLayoutManager.setSpanSizeLookup(new DSpanSizeLookup(recyclerViewAdapter, gridLayoutManager.getSpanCount() - 2)); recyclerView.setLayoutManager(gridLayoutManager); ((DefaultItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); recyclerViewAdapter.addFootView(view1); recyclerView.setAdapter(recyclerViewAdapter);
---继承自RecyclerView.Adapter的类
public abstract class DBaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<DBaseRecyclerViewHolder> { private List<T> mDatas; private Context mContext; /** * 默认点击监听事件 */ public interface OnClickItemListener { void onClick(int poisiton); } OnClickItemListener onClickItemListsner; public void setOnClickItemListsner(OnClickItemListener onClickItemListsner) { this.onClickItemListsner = onClickItemListsner; } public OnClickItemListener getOnClickItemListsner() { return onClickItemListsner; } private DRecyclerViewAdapter mDRecyclerViewAdapter; public DRecyclerViewAdapter getmDRecyclerViewAdapter() { return mDRecyclerViewAdapter; } public void setDRecyclerViewAdapter(DRecyclerViewAdapter mDRecyclerViewAdapter) { this.mDRecyclerViewAdapter = mDRecyclerViewAdapter; } private DRecyclerViewAdapter dRecyclerViewAdapter; public DBaseRecyclerViewAdapter(List<T> mDatas, Context mContext) { this.mDatas = mDatas; this.mContext = mContext; } @Override public DBaseRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return onCreateViewHolder1(parent, viewType); } protected abstract DBaseRecyclerViewHolder onCreateViewHolder1(ViewGroup parent, int viewType); @Override public void onBindViewHolder(DBaseRecyclerViewHolder holder, int position) { holder.setData(mDatas.get(position), position); } @Override public int getItemCount() { return mDatas.size(); } public boolean isHeader(int position) { return getHeaderViewsCount() > 0 && position < getHeaderViewsCount(); } public boolean isFooter(int position) { int lastPosition = getItemCount() - 1; return getFooterViewsCount() > 0 && position > lastPosition - getFooterViewsCount() && position <= lastPosition; } private int getFooterViewsCount() { return mDRecyclerViewAdapter.getFootSize(); } public int getHeaderViewsCount() { return mDRecyclerViewAdapter.getHeadSize(); }}----继承自RecyclerView.ViewHolder的viewHolder
public abstract class DBaseRecyclerViewHolder<T> extends RecyclerView.ViewHolder { private DBaseRecyclerViewAdapter dBaseRecyclerViewAdapter; private DRecyclerViewAdapter mDRecyclerViewAdapter; DBaseRecyclerViewAdapter.OnClickItemListener onClickItemListsner; public DBaseRecyclerViewAdapter.OnClickItemListener getOnClickItemListsner() { return onClickItemListsner; } public DBaseRecyclerViewHolder(View itemView, DBaseRecyclerViewAdapter dBaseRecyclerViewAdapter) { super(itemView); this.dBaseRecyclerViewAdapter = dBaseRecyclerViewAdapter; mDRecyclerViewAdapter = dBaseRecyclerViewAdapter.getmDRecyclerViewAdapter(); onClickItemListsner = dBaseRecyclerViewAdapter.getOnClickItemListsner(); } public DBaseRecyclerViewHolder(ViewGroup parent, @LayoutRes int res, DBaseRecyclerViewAdapter dBaseRecyclerViewAdapter) { super(LayoutInflater.from(parent.getContext()).inflate(res, parent, false)); mDRecyclerViewAdapter = dBaseRecyclerViewAdapter.getmDRecyclerViewAdapter(); this.dBaseRecyclerViewAdapter = dBaseRecyclerViewAdapter; onClickItemListsner = dBaseRecyclerViewAdapter.getOnClickItemListsner(); } protected <T extends View> T $(@IdRes int id) { return (T) itemView.findViewById(id); } public abstract void setData(T data, int position);//// /**// * 处理有头部和尾部的情况 返回点击的位置// * @return// */// /**// * 获取点击的item的position// *// * @return// */// public int getAdapterItemPosition()// {// int oldPosition = getAdapterPosition();//// if (dBaseRecyclerViewAdapter == null)// {// return oldPosition;// }//// if (dBaseRecyclerViewAdapter.isHeader(oldPosition) || dBaseRecyclerViewAdapter.isFooter(oldPosition))// {// return - 1;// }// else// {// return oldPosition - dBaseRecyclerViewAdapter.getHeaderViewsCount();// }// }}
-----DRecyclerViewAdapter类的方法
public class DRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public static final String Tag = DRecyclerViewAdapter.class.getName(); private RecyclerView.Adapter mInnerAdapter; public DRecyclerViewAdapter(DBaseRecyclerViewAdapter adapter) { setAdapter(adapter); } public void setAdapter(DBaseRecyclerViewAdapter myAdapter) { if (myAdapter != null) { if (! (myAdapter instanceof RecyclerView.Adapter)) throw new RuntimeException("your adapter must be a RecyclerView.Adapter"); } this.mInnerAdapter = myAdapter; myAdapter.setDRecyclerViewAdapter(this); } /** * head foot list cache */ private List<View> mHeadViews = new ArrayList<View>(); private List<View> mFootViews = new ArrayList<View>(); private List<View> mRandomViews = new ArrayList<View>(); private SparseArray<Integer> mRandomViews_position = new SparseArray<Integer>(); /** * addHead to recyclerview * * @param view */ public void addHeadView(View view) { mHeadViews.add(view); } /** * addFoot to RecyclerView * * @param view */ public void addFootView(View view) { mFootViews.add(view); } /** * 使用一次 存下来 后续 好查找 */ private int index = 0; public void addRandomView(View view, int posistion) { mRandomViews_position.append(posistion, index); index++; mRandomViews.add(view); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { DRecyclerViewHolder dRecyclerViewHolder; if (viewType < mHeadViews.size()) { Log.e(Tag, "headView" + viewType); return new DRecyclerViewHolder(mHeadViews.get(viewType)); } else if (viewType >= mHeadViews.size() && viewType < mHeadViews.size() + mInnerAdapter.getItemCount()) { if (mRandomViews_position.get(viewType - mHeadViews.size()) != null) { View view = mRandomViews.get(mRandomViews_position.get(viewType - mHeadViews.size())); return new DRecyclerViewHolder(view); } return mInnerAdapter.onCreateViewHolder(parent, viewType - mHeadViews.size()); } else { int position = viewType - mHeadViews.size() - mInnerAdapter.getItemCount(); if (position >= 0 && position < mFootViews.size()) { return new DRecyclerViewHolder(mFootViews.get(position)); } else { return null; } } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (position >= mHeadViews.size() && position < mHeadViews.size() + mInnerAdapter.getItemCount()) { //不包括那些插入的 if (mRandomViews_position.get(position - mHeadViews.size()) == null) mInnerAdapter.onBindViewHolder(holder, position - mHeadViews.size()); } else { /** * 瀑布流的设置处理 */ ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) { ((StaggeredGridLayoutManager.LayoutParams) layoutParams).setFullSpan(true); } } } @Override public int getItemCount() { return mHeadViews.size() + mInnerAdapter.getItemCount() + mFootViews.size(); } @Override public int getItemViewType(int position) { return position; } public int getFootSize() { return mFootViews.size(); } public int getHeadSize() { return mHeadViews.size(); } public boolean isHeader(int position) { return position < mHeadViews.size() ? true : false; } public boolean isFooter(int position) { return position >= mHeadViews.size() + mInnerAdapter.getItemCount() ? true : false; } public boolean isRandom(int position) { return mRandomViews_position.get(position - mHeadViews.size()) != null ? true : false; } static class DRecyclerViewHolder extends RecyclerView.ViewHolder { public DRecyclerViewHolder(View itemView) { super(itemView); } }}
阅读全文
0 0
- 使用RecyclerView实现动态添加头布局,脚布局
- RecyclerView添加头脚布局,使用SwipeRefreshLayout的实现
- RecyclerView添加头布局
- Recyclerview添加头布局
- RecyclerView头布局添加
- RecyclerView添加头布局
- android新特性:使用RecyclerViewHeader一键添加RecyclerView头布局并实现轮播效果
- android新特性:使用RecyclerViewHeader一键添加RecyclerView头布局并实现轮播效果
- 使用ItemDecoration自定义RecyclerView的分割线实现头布局
- ListView添加头布局和脚布局
- RecyclerView使用详解一代替ListView(点击事件,添加头布局,上拉刷新下拉加载)
- RecyclerView添加Header(头布局)+无限轮播
- RecyclerView的多条目加载,添加头布局
- RecyclerView添加多种布局
- recyclerview头布局独占一行
- ListView添加头布局
- recycle添加头布局
- PullToRefresh添加头布局
- 用HTML和CSS制作现流行的UI Placeholder
- C#Linq语法二
- 自适应控制设计(二)
- lineageos错误7,来自贴吧的小技巧
- 【显示过滤/排序结果】非常实用
- 使用RecyclerView实现动态添加头布局,脚布局
- IDEA开发中比较常用的快捷键
- SGU 115. Calendar (基姆拉尔森公式)
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛-A-Visiting Peking University
- POJ 2965.The Pilots Brothers' refrigerator
- postgresql基于docker主从复制搭建
- 9.27
- 在外置移动硬盘中安装Win10
- 【IOS学习之常见问题】UIScrollView 不能滑动(ScrollView has ambiguous scrollable content height)