现阶段,我们创建了最简单的android项目,现在在此公布github链接 https://github.com/neuyu/android-best-practices,希望大家多多支持。
因为之前谈到过包结构的定义,我选择第一种方式,按照android特性定义,所以你的包结构应该是这样的:
recyclerview
在mainactivity中,我们需要用到recyclerview这一新控件,那么如何引用,如何使用它呢?在gradle文件中添加库依赖:
1
|
compile 'com.android.support:recyclerview-v7:23.1.1' |
这样我们可以使用recyclerview啦。
recyclerview的用法
那么好了,recyclerview是一个控件,所以你需要在xml中进行声明,当然其也支持在java代码中动态构建。
通过实例化后,你需要为其设置layoutmanager和adapter。
关于layoutmanager,用来确定每一个item如何进行排列摆放,何时展示和隐藏。回收或重用一个view的时候,layoutmanager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的view和频繁的调用findviewbyid方法(与listview原理类似)。
目前sdk中提供了三种自带的layoutmanager:
- linearlayoutmanager
- gridlayoutmanager
- staggeredgridlayoutmanager
基于原型图:
linearlayoutmanager的效果图如下:
gridlayoutmanager的效果图如下所示:
关于adapter
我们使用到了cardview,而其也是v7包里单独存在的,所以你需要在gradle文件中申明:
1
|
compile 'com.android.support:cardview-v7:23.1.1' |
注意每个cardview都是一个item,类似于listview,因此你可以为cardview添加自定义布局。如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<android.support.v7.widget.cardview xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:card_view= "http://schemas.android.com/apk/res-auto" xmlns:tools= "http://schemas.android.com/tools" android:id= "@+id/list_card_view" style= "@style/cardstyle" android:clickable= "true" android:foreground= "?android:attr/selectableitembackground" card_view:cardcornerradius= "4dp" card_view:cardelevation= "4dp" > <relativelayout style= "@style/cardrelativelayoutstyle" tools:ignore= "uselessparent" > <textview android:id= "@+id/itemtext" style= "@style/carditem" /> </relativelayout> </android.support.v7.widget.cardview> |
对应的adapter需要继承recycleview.adapter,其为泛型,需要传入你自定义的viewholder。所以你也需要定义你的静态内部类,让其继承recycleview.viewholder,并且recycleview并没有相关itemclick点击事件,所以你需要在静态类中定义点击事件,具体如下所示:
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
|
public class cardviewadapter extends recyclerview.adapter<cardviewadapter.cardviewholder>{ public cardviewadapter(list<itemtest> list, context context){ mlist=list; mcontext=context; } @override public cardviewholder oncreateviewholder(viewgroup parent, int viewtype) { view item= layoutinflater.from(mcontext).inflate(r.layout.adapter_item,parent, false ); return new cardviewholder(item, new cardviewholder.clicklistener() { @override public void onwholeclick( int position) { redirecttodetail(position); } }); } public static class cardviewholder extends recyclerview.viewholder implements view.onclicklistener{ public cardviewholder(view itemview,clicklistener clicklistener) { super (itemview); this .mclicklistener=clicklistener; list_card_view=(cardview)itemview.findviewbyid(r.id.list_card_view); list_card_view.setonclicklistener( this ); } public interface clicklistener{ void onwholeclick( int position); } } } |
关于recycleview和cardview的相关特性和深入理解,将会在下一篇介绍。