本文给大家介石介绍下如何利用recyclerview实现多item布局的加载,多item布局的加载的意思就是在开发过程中list的每一项可能根据需求的不同会加载不同的layout。
下面给大家展示下演示效果图:
* 图片资源版权归属于facebook dribbble
recyclerview实现加载不同的layout的核心就是在adapter的oncreateviewholder里面去根据需求而加载不同的布局。
具体的实现步骤:(以android studio作为开发工具)
1:gradle配置 build.gradle
这里cardview也是一种新的布局容器,上一篇有介绍。
compile 'com.android.support:recyclerview-v7:23.1.1'
compile 'com.android.support:cardview-v7:23.1.1'
2:建立列表的布局 activity_recyclerview.xml
1
2
3
4
5
6
7
8
9
10
11
|
<?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" > <android.support.v7.widget.recyclerview xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" android:id= "@+id/rv_list" /> </linearlayout> |
由于需要多种item layout的加载,我们需要建立2个item布局
3:建立列表item项的布局(1) item1.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<?xml version= "1.0" encoding= "utf-8" ?> <android.support.v7.widget.cardview xmlns:card_view= "http://schemas.android.com/apk/res-auto" xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:layout_margin= "8dp" android:id= "@+id/cv_item" android:foreground= "?android:attr/selectableitembackground" card_view:cardcornerradius= "4dp" card_view:cardbackgroundcolor= "#ffffff" card_view:cardelevation= "4dp" > <linearlayout android:layout_width= "match_parent" android:layout_height= "wrap_content" android:orientation= "vertical" > <imageview android:id= "@+id/iv_item1_pic" android:layout_width= "match_parent" android:layout_height= "120dp" android:layout_weight= "1" android:background= "@mipmap/lighthouse" /> <textview android:id= "@+id/tv_item1_text" android:padding= "20dp" android:layout_width= "match_parent" android:layout_height= "wrap_content" /> </linearlayout> </android.support.v7.widget.cardview> |
4:建立列表item项的布局(2) item2.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<?xml version= "1.0" encoding= "utf-8" ?> <android.support.v7.widget.cardview xmlns:card_view= "http://schemas.android.com/apk/res-auto" xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:layout_margin= "8dp" android:foreground= "?android:attr/selectableitembackground" card_view:cardcornerradius= "4dp" card_view:cardbackgroundcolor= "#e040fb" card_view:cardelevation= "4dp" > <linearlayout android:layout_width= "match_parent" android:layout_height= "wrap_content" android:orientation= "vertical" > <textview android:id= "@+id/tv_item2_text" android:padding= "20dp" android:textcolor= "#ffffff" android:layout_width= "match_parent" android:layout_height= "wrap_content" /> </linearlayout> </android.support.v7.widget.cardview> |
*最重要的部分 adapter
5:建立recyclerview的adapter,recyclerviewadapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
import android.content.context; import android.support.v7.widget.recyclerview; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.textview; /** * created by lijizhou on 2016/2/21. */ public class recyclerviewadapter extends recyclerview.adapter<recyclerview.viewholder> { private layoutinflater mlayoutinflater; private context context; private string [] titles; //建立枚举 2个item 类型 public enum item_type { item1, item2 } public recyclerviewadapter(context context,string[] titles){ this .titles = titles; this .context = context; mlayoutinflater = layoutinflater.from(context); } @override public recyclerview.viewholder oncreateviewholder(viewgroup parent, int viewtype) { //加载item view的时候根据不同type加载不同的布局 if (viewtype == item_type.item1.ordinal()) { return new item1viewholder(mlayoutinflater.inflate(r.layout.item1, parent, false )); } else { return new item2viewholder(mlayoutinflater.inflate(r.layout.item2, parent, false )); } } @override public void onbindviewholder(recyclerview.viewholder holder, int position) { if (holder instanceof item1viewholder) { ((item1viewholder) holder).mtextview.settext(titles[position]); } else if (holder instanceof item2viewholder) { ((item2viewholder) holder).mtextview.settext(titles[position]); } } //设置item类型,可以自由发挥,这里设置item position单数显示item1 偶数显示item2 @override public int getitemviewtype( int position) { //enum类提供了一个ordinal()方法,返回枚举类型的序数,这里item_type.item1.ordinal()代表0, item_type.item2.ordinal()代表1 return position % 2 == 0 ? item_type.item1.ordinal() : item_type.item2.ordinal(); } @override public int getitemcount() { return titles == null ? 0 : titles.length; } //item1 的viewholder public static class item1viewholder extends recyclerview.viewholder{ textview mtextview; public item1viewholder(view itemview) { super (itemview); mtextview=(textview)itemview.findviewbyid(r.id.tv_item1_text); } } //item2 的viewholder public static class item2viewholder extends recyclerview.viewholder{ textview mtextview; public item2viewholder(view itemview) { super (itemview); mtextview=(textview)itemview.findviewbyid(r.id.tv_item2_text); } } } |
ok,adapter建立好了,那么最后一步就是在activity里面进行相关操作
6:列表页面的类文件 recyclerviewactivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import android.os.bundle; import android.support.v7.app.appcompatactivity; import android.support.v7.widget.gridlayoutmanager; import android.support.v7.widget.linearlayoutmanager; import android.support.v7.widget.recyclerview; /** * created by lijizhou on 2016/2/21. */ public class recyclerviewactivity extends appcompatactivity { private recyclerview mrecyclerview; //item 显示所需(仅供demo) private string[] title = { "blog : http://blog.csdn.net/leejizhou." , "a good laugh and a long sleep are the best cures in the doctor's book." , "all or nothing, now or never " , "be nice to people on the way up, because you'll need them on your way down." , "be confident with yourself and stop worrying what other people think. do what's best for your future happiness!" , "blessed is he whose fame does not outshine his truth." , "create good memories today, so that you can have a good past" }; @override protected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); setcontentview(r.layout.activity_recyclerview); mrecyclerview=(recyclerview)findviewbyid(r.id.rv_list); //这里根据上一个页面的传入值来加载list或grid,上一个页面仅仅2个按钮,参考演示demo if (getintent().getintextra( "type" , 0 ) == 1 ){ //list linearlayoutmanager layoutmanager = new linearlayoutmanager( this ); layoutmanager.setorientation(linearlayoutmanager.vertical); mrecyclerview.setlayoutmanager(layoutmanager); } else if (getintent().getintextra( "type" , 0 ) == 2 ){ //grid mrecyclerview.setlayoutmanager( new gridlayoutmanager( this , 2 )); } //recyclerview设置adapter mrecyclerview.setadapter( new recyclerviewadapter( this , title)); } } |
ok,这样recyclerview的多item布局的加载就实现,关于recyclerview的使用之多种item加载布局就给大家介绍这么多,希望对大家有所帮助!