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

Android RecyclerView布局就这么简单

程序员文章站 2024-03-01 14:30:34
recyclerview是什么? 笔者个人看法,recyclerview只是一个对listview的升级版,这个升级的主要目的是为了让这个view的效率更高,并且使用更加...

recyclerview是什么?

笔者个人看法,recyclerview只是一个对listview的升级版,这个升级的主要目的是为了让这个view的效率更高,并且使用更加方便。
我们知道,listview通过使用viewholder来提升性能。viewholder通过保存item中使用到的控件的引用来减少findviewbyid的调用,以此使listview滑动得更加顺畅。但这种模式在listview中即使不使用也无妨。
换言之,在listview中你不考虑复用的问题也可以,只是你牺牲了内存来方便了代码。但是recyclerview就不允许你这么做了,你使用recyclerview就意味着你一定要复用,而效果上其实和listview+viewholder差不多。

demo效果:(源码在文章结尾)

Android RecyclerView布局就这么简单

主要实现功能:
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()); 
      } 
    } 

源码截图:

Android RecyclerView布局就这么简单

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布局有所帮助。