Android 中RecyclerView通用适配器的实现
android 中recyclerview通用适配器的实现
前言:
sdk的5.0版本出来已经n久了,可以说是已经经过许多人的检验了,里面的新控件不能说是非常完美,但也是非常好用了,其中最让我喜爱的就是recyclerview了,可以完美替代listview和gridview(除了添加headerview和footview了,网上有许多解决方式。这个下面会以一种简单的方式顺带解决,肯定为大家省心),而且可以代码动态切换这两种布局方式以及瀑布流布局。相关切换方式网上有很多,大家自行搜索,我就不贴连接了。
相信大家在之前使用listview时肯定一直很厌烦重复编写无数的adapter,当然有那么一部分机智如我的人肯定一直使用着万能适配器。然而recyclerview要求我们必须使用viewholder来实现adapter。这就让许多用惯了万能适配器的人不爽了。今天我就提供一直基于listview万能适配器的实现原理来改良实现的recyclerview的通用适配器,由于不是教学,切代码比较简单,就不分段讲解了,相信大家看注释就能看懂。
一共两个类,一个是继承了系统的android.support.v7.widget.recyclerview.viewholder所实现的rviewholder类,通过他实现任意控件的缓存一个是继承了android.support.v7.widget.recyclerview.adapter所实现的rbaseadapter类。
实现代码:
rviewholder
import android.content.context; import android.graphics.bitmap; import android.support.v7.widget.recyclerview.viewholder; import android.util.sparsearray; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.imageview; import android.widget.textview; public class rviewholder extends viewholder { private context mcontext; private view mconvertview; private sparsearray<view> mviews; public rviewholder(view itemview) { super(itemview); mconvertview = itemview; this.mviews = new sparsearray<view>(); } public static rviewholder get(context context, viewgroup parent, int layoutid, int position) { view view = layoutinflater.from(context).inflate(layoutid, parent, false); return new rviewholder(view); } /** * 通过控件的id获取对于的控件,如果没有则加入views * * @param viewid * @return */ public <t extends view> t getview(int viewid) { view view = mviews.get(viewid); if (view == null) { view = mconvertview.findviewbyid(viewid); mviews.put(viewid, view); } return (t) view; } /** * 为textview设置字符�? * * @param viewid * @param text * @return */ public viewholder settext(int viewid, string text) { textview view = getview(viewid); view.settext(text); return this; } /** * 为imageview设置图片 * * @param viewid * @param drawableid * @return */ public viewholder setimageresource(int viewid, int drawableid) { imageview view = getview(viewid); view.setimageresource(drawableid); return this; } /** * 为imageview设置图片 * * @param viewid * @param drawableid * @return */ public viewholder setimagebitmap(int viewid, bitmap bm) { imageview view = getview(viewid); view.setimagebitmap(bm); return this; } public view getconvertview() { return mconvertview; } }
这里是rbaseadapter
import java.util.arraylist; import java.util.collection; import java.util.list; import android.content.context; import android.support.v7.widget.recyclerview.adapter; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.linearlayout; public abstract class rbaseadapter<t> extends adapter<rviewholder> { private context mcontext; private list<t> list; protected layoutinflater minflater; private int mitemlayoutid; public rbaseadapter(context context) { // todo auto-generated constructor stub this.mcontext = context; this.minflater = layoutinflater.from(mcontext); this.mitemlayoutid = new linearlayout(mcontext).getid(); this.list = new arraylist<t>(); } public rbaseadapter(context context, list<t> list) { // todo auto-generated constructor stub this.mcontext = context; this.minflater = layoutinflater.from(mcontext); this.mitemlayoutid = new linearlayout(mcontext).getid(); this.list = list; } public rbaseadapter(context context, list<t> list, int itemlayoutid) { this.mcontext = context; this.minflater = layoutinflater.from(mcontext); this.mitemlayoutid = itemlayoutid; this.list = list; } public rbaseadapter(context context, int itemlayoutid) { this.mcontext = context; this.minflater = layoutinflater.from(mcontext); this.mitemlayoutid = itemlayoutid; this.list = new arraylist<t>(); } public void setitemlayoutid(int itemlayoutid) { this.mitemlayoutid = itemlayoutid; } public list<t> getlist() { return this.list; } public void appendlist(list<t> list) { // todo auto-generated method stub this.list = list; notifydatasetchanged(); } public void addlist(list<t> list2) { // todo auto-generated method stub this.list.addall((collection<? extends t>) list2); notifydatasetchanged(); } @override public int getitemcount() { return list.size(); } boolean hasheader = false; boolean hasfooter = false; view headerview; view footerview; public void setheaderview(view headerview) { hasheader=true; this.headerview = headerview; } public void setfooterview(view footerview) { hasfooter = true; this.footerview = footerview; } public view getheaderview() { return headerview; } public view getfooterview() { return footerview; } @override public void onbindviewholder(rviewholder holder, int position) { if (hasheader && position == 0) { return; } else if (hasfooter && position == (list.size() + (hasheader ? 1 : 0))) { return; } else convert(holder, (t) list.get(position)); } @override public rviewholder oncreateviewholder(viewgroup parent, int position) { if (hasheader && position == 0) { return new rviewholder(headerview); } else if (hasfooter && position == (list.size() + (hasheader ? 1 : 0))) { return new rviewholder(footerview); } else return rviewholder.get(mcontext, parent, mitemlayoutid, position); } //这里定义抽象方法,我们在匿名内部类实现的时候实现此方法来调用控件 public abstract void convert(rviewholder holder, t item); }
对于rbaseadapter稍微讲解下,首先是泛型,这样任何对象类型都可以使用,再来就是前面提到的headerview和footerview的解决,可以看到rbaseadapter里面定义了几个方法,通过position的不同来加载不同的布局的思想来添加headerview和footerview。
activity里面调用
recyclerview.setadapter(new rbaseadapter<virtualwinsbean>(mcontext, r.layout.virtual_win_users_list_item) { @override public void convert(rviewholder holder, virtualwinsbean item) { if (util.checknull(item.getnick_name())) { holder.settext(r.id.name, util.hidephone(item.getphone() + "")); } else { holder.settext(r.id.name, item.getnick_name()); } roundimageview networkimageview = holder.getview(r.id.photo); networkimageview.setloadingimage(r.drawable.header_def); networkimageview.setdefultimage(r.drawable.header_def); networkimageview.loadurl(u.g(item.getfile_url())); } });
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
推荐阅读
-
详解JavaScript实现设计模式中的适配器模式的方法
-
android中RecyclerView自定义分割线实现
-
Android无限循环RecyclerView的完美实现方案
-
Android中Fragment相互切换间不被回收的实现方法
-
Android实现RecyclerView添加分割线的简便方法
-
Android编程实现在Activity中操作刷新另外一个Activity数据列表的方法
-
Android中快速便捷的实现圆角按钮方法详解
-
Android单个RecyclerView实现列表嵌套的效果
-
Android中 自定义数据绑定适配器BaseAdapter的方法
-
解析Android开发中多点触摸的实现方法