Android RecyclerView布局就这么简单
recyclerview是什么?
笔者个人看法,recyclerview只是一个对listview的升级版,这个升级的主要目的是为了让这个view的效率更高,并且使用更加方便。
我们知道,listview通过使用viewholder来提升性能。viewholder通过保存item中使用到的控件的引用来减少findviewbyid的调用,以此使listview滑动得更加顺畅。但这种模式在listview中即使不使用也无妨。
换言之,在listview中你不考虑复用的问题也可以,只是你牺牲了内存来方便了代码。但是recyclerview就不允许你这么做了,你使用recyclerview就意味着你一定要复用,而效果上其实和listview+viewholder差不多。
demo效果:(源码在文章结尾)
主要实现功能:
1、可以动态排版,选择linearlayou和gridlayout
2、可以增减item
3、实现对item点击事件的监听
4、实现点击事件,点击后能够使item中的字体变成红色
recyclerview如何使用?
recyclerview是support-v7包中的新组件(此处意味着首先要导入v7包),是一个强加的滑动组件,与经典的listview相比,它同样拥有item回收服用的功能,但是recyclerview已经封装好了viewholder,用户只需要实现自己的viewholder就可以了,该组件会自动帮你复用每一个item。
使用recyclerview笔者认为主要有两个步骤:
1、设置layoutmanager
2、设置和定义adapter(主要是实现viewholder)
由于recyclerview与listview的使用比较类似,此处还是用大家比较熟悉的listview来解释。
recyclerview与listview的使用,主要不同在两个地方:
1、需要定义layoutmanager(这点比较简单,不多讲解)
2、listview定义的adapter主要是针对view来进行操作的,而recyclerview主要是针对viewholder来进行操作的。
3、listview本身实现了点击事件,而recyclerview如果需要点击事件,需要自己写一个接口。(新手不要害怕,并不难)
下面就分点介绍一下在listview中不会碰到的几个点,也可能是新手认为的recyclerview的难点:
一、recyclerview针对viewholder来进行操作
此处主要需要了解recyclerview必须实现的三个方法:
public viewholder oncreateviewholder(viewgroup parent, int viewtype)
在任何viewholder被实例化的时候,oncreateviewholder将会被触发。
此处实现的内容与fragment中的oncreateview差不多,只是oncreateview最后返回的是view而此处返回的是一个viewholder。(注意:使用的时候此处的viewholder应该是自己定义的,而不是recyclerview.viewholder)
public void onbindviewholder(viewholder holder, int position)
此处建立起viewholder中视图与数据的关联。由于viewholder是自己实现的,此处使用viewholder会显得特别*方便。
public int getitemcount()
这个就不多说了,和listview中的差不多,返回数据的size。
除了这三个方法外,最重要的是需要自己实现一个viewholder,这个viewholder也需要继承recyclerview.viewholder,(如果需要实现点击事件,也需要应用onclicklistener)
在这个viewholder中,可以设置属性,并且与viewholder视图内的各个控件绑定,使用起来就十分方便了。
笔者demo中代码:
public class viewholder extends recyclerview.viewholder implements view.onclicklistener { public textview tvviewholder; public linearlayout llviewholder; //初始化viewholder,此处绑定后在onbindviewholder中可以直接使用 public viewholder(view itemview){ super(itemview); tvviewholder=(textview)itemview.findviewbyid(r.id.tv_view_holder); llviewholder=(linearlayout) itemview; llviewholder.setonclicklistener(this); } //通过接口回调来实现recyclerview的点击事件 @override public void onclick(view v) { if(monitemclicklistener!=null) { //此处调用的是onitemclick方法,而这个方法是会在recycleradapter被实例化的时候实现 monitemclicklistener.onitemclick(v, getitemcount()); } } }
二、点击事件需要自己写一个接口
这个如果花点时间了解概念,其实并不难,主要有以下步骤:(不懂可以看笔者demo)
下面均为笔者demo中的代码;
1、创建一个接口,并在里面写上你需要实现的方法
//定义onitemclicklistener的接口,便于在实例化的时候实现它的点击效果 public interface onitemclicklistener { void onitemclick(view view, int position); }
2、创建一个该接口的对象来存储监听事件
public onitemclicklistener monitemclicklistener;
3、在需要使用到该方法的地方进行调用
public viewholder(view itemview){ super(itemview); tvviewholder=(textview)itemview.findviewbyid(r.id.tv_view_holder); llviewholder=(linearlayout) itemview; llviewholder.setonclicklistener(this); } //通过接口回调来实现recyclerview的点击事件 @override public void onclick(view v) { if(monitemclicklistener!=null) { //此处调用的是onitemclick方法,而这个方法是会在recycleradapter被实例化的时候实现 monitemclicklistener.onitemclick(v, getitemcount()); } }
源码截图:
mainactivity:
package com.example.double2.recyclerviewtest; import android.graphics.color; 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; import android.view.view; import android.widget.adapterview; import android.widget.arrayadapter; import android.widget.button; import android.widget.spinner; import android.widget.textview; import java.util.arraylist; import java.util.list; public class mainactivity extends appcompatactivity { private recyclerview mrecyclerview; private recycleradapter mrecycleradapter; private recyclerview.layoutmanager mlayoutmanager; private spinner mspinner; private list<string> mdata = new arraylist<string>(); @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //增加测试数据 mdata.add("recycler"); mdata.add("recycler"); mdata.add("recycler"); initview(); } private void initview() { mrecyclerview = (recyclerview) findviewbyid(r.id.rc_main); mlayoutmanager = new linearlayoutmanager(this); mrecyclerview.setlayoutmanager(mlayoutmanager); mrecyclerview.sethasfixedsize(true); //设置spinner mspinner = (spinner) findviewbyid(r.id.sp_main); list<string> mlist = new arraylist<string>(); mlist.add("linearlayout"); mlist.add("gridlayout"); mspinner.setadapter(new arrayadapter<string>(this, android.r.layout.simple_list_item_1, mlist)); mspinner.setonitemselectedlistener(new adapterview.onitemselectedlistener() { @override public void onitemselected(adapterview<?> parent, view view, int position, long id) { switch (position) { case 0: //设置为线性布局 mrecyclerview.setlayoutmanager(new linearlayoutmanager(mainactivity.this)); break; case 1: //设置为网格布局,3列 mrecyclerview.setlayoutmanager(new gridlayoutmanager(mainactivity.this, 3)); break; } } @override public void onnothingselected(adapterview<?> parent) { } }); mrecycleradapter = new recycleradapter(mdata); mrecyclerview.setadapter(mrecycleradapter); mrecycleradapter.setonitemclicklistener(new recycleradapter.onitemclicklistener() { //此处实现onitemclick的接口 @override public void onitemclick(final view view, int position) { textview tvrecycleviewitemtext = (textview) view.findviewbyid(r.id.tv_view_holder); //如果字体本来是黑色就变成红色,反之就变为黑色 if (tvrecycleviewitemtext.getcurrenttextcolor() == color.black) tvrecycleviewitemtext.settextcolor(color.red); else tvrecycleviewitemtext.settextcolor(color.black); } }); button btnadd = (button) findviewbyid(r.id.btn_main_add); button btndel = (button) findviewbyid(r.id.btn_main_del); btnadd.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { mdata.add("recycler"); int position = mdata.size(); if (position > 0) mrecycleradapter.notifydatasetchanged(); } }); btndel.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { int position = mdata.size(); if (position > 0) { mdata.remove(position - 1); mrecycleradapter.notifydatasetchanged(); } } }); } }
recycleradapter:
package com.example.double2.recyclerviewtest; import android.support.v7.widget.recyclerview; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.linearlayout; import android.widget.textview; import java.util.list; /** * 项目名称:recyclerviewtest * 创建人:double2号 * 创建时间:2016/4/18 8:12 * 修改备注: */ public class recycleradapter extends recyclerview.adapter<recycleradapter.viewholder> { private list<string> mdata; public recycleradapter(list<string> data) { mdata = data; } //定义一个监听对象,用来存储监听事件 public onitemclicklistener monitemclicklistener; public void setonitemclicklistener(onitemclicklistener itemclicklistener) { monitemclicklistener = itemclicklistener; } //定义onitemclicklistener的接口,便于在实例化的时候实现它的点击效果 public interface onitemclicklistener { void onitemclick(view view, int position); } public class viewholder extends recyclerview.viewholder implements view.onclicklistener { public textview tvviewholder; public linearlayout llviewholder; //初始化viewholder,此处绑定后在onbindviewholder中可以直接使用 public viewholder(view itemview){ super(itemview); tvviewholder=(textview)itemview.findviewbyid(r.id.tv_view_holder); llviewholder=(linearlayout) itemview; llviewholder.setonclicklistener(this); } //通过接口回调来实现recyclerview的点击事件 @override public void onclick(view v) { if(monitemclicklistener!=null) { //此处调用的是onitemclick方法,而这个方法是会在recycleradapter被实例化的时候实现 monitemclicklistener.onitemclick(v, getitemcount()); } } } @override public viewholder oncreateviewholder(viewgroup parent, int viewtype) { view views= layoutinflater.from(parent.getcontext()).inflate( r.layout.rc_item,parent,false); return new viewholder(views); } @override public void onbindviewholder(viewholder holder, int position) { //建立起viewholder中试图与数据的关联 holder.tvviewholder.settext(mdata.get(position)+position); } @override public int getitemcount() { return mdata.size(); } }
activity_main:
<?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:orientation="vertical" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" > <android.support.v7.widget.recyclerview android:id="@+id/rc_main" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </android.support.v7.widget.recyclerview> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <spinner android:id="@+id/sp_main" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <button android:id="@+id/btn_main_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/add"/> <button android:id="@+id/btn_main_del" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/del"/> </linearlayout> </linearlayout>
rc_item:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="3dp" android:background="@android:color/darker_gray" android:gravity="center" android:orientation="vertical" > <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher"/> <textview android:id="@+id/tv_view_holder" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textcolor="@android:color/black" android:textsize="20sp"/> </linearlayout>
以上就是本文的全部内容,希望对大家学习android布局有所帮助。
上一篇: java通过PDF模板填写PDF表单
推荐阅读
-
Android RecyclerView布局就这么简单
-
Android开发中RecyclerView模仿探探左右滑动布局功能
-
Android 中RecyclerView多种item布局的写法(头布局+脚布局)
-
Android RecyclerView详解及简单实例
-
Android 中RecyclerView多种item布局的写法(头布局+脚布局)
-
Android开发中RecyclerView模仿探探左右滑动布局功能
-
Android RecyclerView详解及简单实例
-
Android TabLayout(选项卡布局)简单用法实例分析
-
Android RecyclerView加载两种布局的方法
-
Android TabLayout(选项卡布局)简单用法实例分析