Android RecyclerView详解之实现 ListView GridView瀑布流效果
什么是recyclerview
recyclerview 是google推出的最新的 替代listview、gridview的组件,recyclerview是用来显示大量数据的容器,并通过有限数量的子view,来提高滚动时的性能。
与listview不同,recyclerview 不再负责布局,而是专注于布局复用。布局主要通过 layoutmanager来管理,目前提供了3种常用的布局管理:
linearlayoutmanager 线性布局管理器 (listview效果)
gridlayoutmanager 网格布局管理器 (gridview效果)
staggeredgridlayoutmanager 瀑布流管理器
recyclerview 主要通过adapter 来获得要显示的子view。adapter要继承recyclerview.adapter类,并且 需要制定一个 recyclerview.viewholder子类的泛型。
使用recyclerview需要导包,需要在 build.gradle上加入依赖
dependencies { compile filetree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.android.support:recyclerview-v7:21.0.3' ... }
代码如下:
//继承自 recyclerview.adapter class myadapter extends recyclerview.adapter<myadapter.viewholder> { //recyclerview显示的子view //该方法返回是viewholder,当有可复用view时,就不再调用 @override public viewholder oncreateviewholder(viewgroup viewgroup, int i) { view v = getlayoutinflater().inflate(r.layout.recycler_item, null); return new viewholder(v); } //将数据绑定到子view,会自动复用view @override public void onbindviewholder(viewholder viewholder, int i) { viewholder.textview.settext(data[i]); } //recyclerview显示数据条数 @override public int getitemcount() { return data.length; } //自定义的viewholder,减少findviewbyid调用次数 class viewholder extends recyclerview.viewholder { textview textview; imageview imageview; //在布局中找到所含有的ui组件 public viewholder(view itemview) { super(itemview); textview = (textview) itemview.findviewbyid(r.id.textview); imageview = (imageview) itemview.findviewbyid(r.id.imageview); } } }
注意:当数据发生变化时,可以通过notifydatasetchanged来刷新ui,通过getitemviewtype来获取对应位置的类型,但是它不再需要你指定有多少类型了,因为该方法已经能够判断出有多少类型。
子view布局如下:res/layout/recycler
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageview" android:src="@drawable/ic_launcher" /> <textview android:layout_width="wrap_content" android:layout_height="match_parent" android:text="medium text" android:layout_marginleft="5dp" android:gravity="center_vertical" android:id="@+id/textview" /> </linearlayout>
adapter准备好后,接下来就准备recyclerview。在activity的布局中加入recyclerview
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".mainactivity"> <android.support.v7.widget.recyclerview android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" /> </relativelayout>
然后在activity中,加入初始化、设置的代码
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //找到 recyclerview recyclerview recylcer = (recyclerview) findviewbyid(r.id.recyclerview); //listview效果的 linearlayoutmanager linearlayoutmanager mgr = new linearlayoutmanager(this); //vertical纵向,类似listview,horizontal<span style="font-family: arial, helvetica, sans-serif;">横向,类似gallery</span> mgr.setorientation(linearlayoutmanager.vertical); recylcer.setlayoutmanager(mgr); //设置适配器 recylcer.setadapter(new myadapter()); }
运行后的效果如下:
如果要显示为 gridview效果,只用把linearlayoutmanager 换成 gridlayoutmanager
//gridlayout 3列 gridlayoutmanager mgr=new gridlayoutmanager(this,3); recylcer.setlayoutmanager(mgr);
效果如下:
如果要显示效果为 瀑布流,则需要换成 staggeredgridlayoutmanager。
//3列 方向垂直 staggeredgridlayoutmanager mgr = new staggeredgridlayoutmanager(3, staggeredgridlayoutmanager.vertical); recylcer.setlayoutmanager(mgr);
使用瀑布流时,高度最好不一样,所以可以随机设置下子view的高度。修改adapter中的方法
//将数据绑定到子view @override public void onbindviewholder(viewholder viewholder, int i) { viewholder.textview.settext(data[i]); linearlayout.layoutparams lp = new linearlayout.layoutparams( linearlayout.layoutparams.match_parent, <span style="white-space:pre"> </span>100+(int) (math.random() * 50)); viewholder.imageview.setlayoutparams(lp); }
运行效果如下:
以上所述是小编给大家介绍的android recyclerview详解之实现 listview gridview瀑布流效果,希望对大家有所帮助