关于RecyclerView的高级使用
来源:互联网 发布:js f5刷新事件 编辑:程序博客网 时间:2024/05/19 10:36
老规矩先看效果:
咋一看和前几天写的那个用ListView嵌套GridView写的界面很像,但毕竟那个还是太Low了。http://blog.csdn.net/u012305710/article/details/50464982
Android已经推出了RecyclerView替换了ListView那实现起来肯定很简单了。
RecyclerView的Adapter中的
public BaseRecyHolder onCreateViewHolder(ViewGroup parent, int viewType) { return getHolder(parent,viewType); }
中的viewType就能对现在这个布局起到关键性的作用它能决定我们加载那种Holder。
但是获得这个viewType肯定是我们之前已经设置好了viewType,所以就需要重写Adapter中的:
@Override public int getItemViewType(int position) { if (mDatas.get(position).isHead()) { return ITEM_TYPE.ITEM_TYPE_HEADER.ordinal(); } else { return ITEM_TYPE.ITEM_TYPE_CONTENT.ordinal(); } }
这样就能决定我们程序中显示两种布局了。
但是这样真的够了么?显然不行这样只会按照我们设置的GridLayoutManager按照统一的布局显示,不能像效果图一样标题栏能占满一行,这时候我们发现GridLayoutManager 提供了一个 setSpanSizeLookup() 的方法。可以让你传入一个继承自 GridLayoutManager.SpanSizeLookup 的类,在里面可以写每个position对应的item应跨越多少列。
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { boolean head = mDatas.get(position).isHead(); return head ? manager.getSpanCount() : 1; } });
这样就能大功告成了很简单。
在下面贴下代码对adapter进行了封装和对holder进行了封装:
这是基类的adaper:
public abstract class MyBaseRecyAdapter<T> extends RecyclerView.Adapter<BaseRecyHolder> { private List<T> mDatas; public MyBaseRecyAdapter(List<T> mDatas) { this.mDatas = mDatas; } @Override public BaseRecyHolder onCreateViewHolder(ViewGroup parent, int viewType) { return getHolder(parent,viewType); } protected abstract BaseRecyHolder getHolder(ViewGroup parent, int viewType); @Override public void onBindViewHolder(BaseRecyHolder holder, int position) { holder.setAllData(mDatas); holder.setData(mDatas.get(position)); holder.setData(mDatas.get(position),mDatas.size(), position); } @Override public int getItemCount() { return mDatas.size(); }}
下面是项目中的Adapter:
public class AllDeviceAdapter extends MyBaseRecyAdapter<AllDeviceResponse> { private List<AllDeviceResponse> mDatas; public enum ITEM_TYPE { ITEM_TYPE_HEADER, ITEM_TYPE_CONTENT, } public AllDeviceAdapter(List<AllDeviceResponse> mDatas) { super(mDatas); this.mDatas = mDatas; } @Override protected BaseRecyHolder getHolder(ViewGroup parent, int viewType) { LogUtil.e("getHolder viewtype" + viewType); if (viewType == ITEM_TYPE.ITEM_TYPE_HEADER.ordinal()) { View view = UIUtils.inflate(R.layout.view_heard); return new AllDeviceHeaderHolder(view); } else { View view = UIUtils.inflate(R.layout.view_recylitem_all_device); return new AllDeviceContentHolder(view); } } @Override public int getItemViewType(int position) { if (mDatas.get(position).isHead()) { return ITEM_TYPE.ITEM_TYPE_HEADER.ordinal(); } else { return ITEM_TYPE.ITEM_TYPE_CONTENT.ordinal(); } }}
这样以后再写Adapter只要继承封装的Adapter实现其中的两个方法就可以了。
下面是对Holder的封装:
public abstract class BaseRecyHolder extends RecyclerView.ViewHolder {
private View view;
private T mDatas;
private int totalNumber,position;
private List allData;
public BaseRecyHolder(View itemView) { super(itemView); initView(itemView);}protected abstract View initView(View itemView);public void setData(T mDatas) { this.mDatas = mDatas; refreshView();}public void setData(T mDatas,int totalNumber,int position) { this.mDatas = mDatas; this.totalNumber = totalNumber; this.position = position;}public void setAllData(List<T> allData) { this.allData = allData;}public T getData() { return mDatas;}public List<T> getAllData() { return allData;}protected abstract void refreshView();
}
这是项目中的Holder:
public class AllDeviceContentHolder extends BaseRecyHolder<AllDeviceResponse> { @InjectView(R.id.img_icon) ImageView imgIcon; @InjectView(R.id.txt_name) TextView txtName; public AllDeviceContentHolder(View itemView) { super(itemView); } @Override protected View initView(View itemView) { ButterKnife.inject(this, itemView); return itemView; } @Override protected void refreshView() { AllDeviceResponse data = getData(); txtName.setText(data.getName()); }}
这样就大功告成了。在这里还发现了个写的比较好的文章分享给大家:
http://xingrz.me/2014/2014-11-25/meizhi.html
- 关于RecyclerView的高级使用
- recyclerview的高级使用
- 关于RecyclerView的使用
- 关于RecyclerView的使用
- RecyclerView的通用适配器的高级使用
- Android 高级编程 RecyclerView 控件的使用
- android关于RecyclerView的使用
- Android高级控件系列四之RecyclerView的使用
- 安卓高级控件3之RecyclerView的使用
- 安卓高级控件3之RecyclerView的使用
- [Android]关于RecyclerView控件的使用
- 关于Recyclerview使用时的一个错误
- 关于RecyclerView 25+的使用问题
- android recyclerview 关于viewtype的使用
- 关于Recyclerview使用小记
- RecyclerView+RecyclerView.Adapter+RecyclerView.ViewHolder的使用
- 关于RecyclerView的疑惑
- 关于RecyclerView的随笔
- postgresql 通过pgAdmin III 工具创建表有 双引号问题
- Multidimensional scaling(MDS)简介
- POJ3750 循环链表解决约瑟夫问题
- 【有源汇点上下界最小流】[SGU176]Flow construction
- 【慕课笔记】第四章 流程控制语句 第10节 JAVA循环跳转语句之continue
- 关于RecyclerView的高级使用
- javaweb学习(二)-http协议
- 线程condition
- 利用python3.4爬取学校教务系统,并封装成api供app调用(一)
- 【UI篇】一、UIApplication
- html添加字体图标font icon
- 扩展系统功能——装饰模式(四):装饰模式总结
- commit和checkpoint之间的关系
- ubuntu12.04下触摸屏YT-104CQT驱动安装教程