欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android RecyclerView详解之实现 ListView GridView瀑布流效果

程序员文章站 2024-03-05 23:05:43
 什么是recyclerview recyclerview 是google推出的最新的 替代listview、gridview的组件,recyclervie...

 什么是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()); 
} 

运行后的效果如下:

Android RecyclerView详解之实现 ListView GridView瀑布流效果Android RecyclerView详解之实现 ListView GridView瀑布流效果

如果要显示为 gridview效果,只用把linearlayoutmanager 换成 gridlayoutmanager

//gridlayout 3列 
gridlayoutmanager mgr=new gridlayoutmanager(this,3); 
recylcer.setlayoutmanager(mgr); 

效果如下:

Android RecyclerView详解之实现 ListView GridView瀑布流效果

如果要显示效果为 瀑布流,则需要换成 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瀑布流效果

以上所述是小编给大家介绍的android recyclerview详解之实现 listview gridview瀑布流效果,希望对大家有所帮助