文档章节

RecyclerView的简单用法

公子彦
 公子彦
发布于 2016/05/12 23:03
字数 1136
阅读 112
收藏 1

        在Android开发中,ListView是用途非常广泛的控件,与它类似的还有GridView。为了统一性和代码的解耦性,google在V7包中新增了RecyclerView控件,来代替ListView和GridView控件。

        RecyclerView的用法其实非常简单,它可以通过设置LayoutManager来控制它的布局,官方给出了三种布局可供选择,分别是线性布局LinearLayoutManager、九宫格布局GridLayoutManager以及瀑布流布局StaggeredGridLayoutManager。也就是说recyclerView只负责创建和显示列表,布局什么的事情都交给LayoutManager来做。但是RecyclerView也有它的不便,它并没有自己的onItemClick方法,所以要设置点击事件必须自己去写,关于具体写法我会再Demo中去更新。

    废话不多说,下面我来介绍一下RecyclerView的简单用法,这里是以线性布局为例,最后又项目实例下载,不愿意看我废话的可以直接去下载。

    1、现在Android开发最常用的就是Android Studio,所以这里也是以AS为例,首先我们要做的就是添加依赖,找到工程下的build.gradle,加入如下代码:

compile 'com.android.support:recyclerview-v7:23.3.0'

    注意:版本号根据你自己的编译版本决定,一级版本号必须相同,二级版本号可以有差异,另外如果想让自己的列表的item有卡片式效果可以添加下面这个依赖,使用的时候直接用cardView控件包裹item布局即可。

compile 'com.android.support:cardview-v7:23.2.1'

    2、添加依赖同步成功以后,在XML文件中 加入recyclerView控件如下,另外还需要一个列表的item布局,只需要一个TextView,这里我就不再多写了。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


</android.support.v7.widget.RecyclerView>

3、添加好依赖、写好布局,现在我们来看一下Java代码应该怎么写,实际上只需要三步

1)RecyclerView mRecyclerView =  (RecyclerView)findViewById(R.id.recyclerView);

2)mRecyclerView.setLayoutManager(

            new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));

3) mRecyclerView.setAdapter(new MyAdapter(mList));

    其中第一步就不必多说,第二步是设置布局的关键一步,setLayoutManager需要的参数就是RecyclerView.LayoutManager对象,这里我写的是匿名对象,也可以先声明LayoutManager对象写好配置再传进来。匿名LayoutManager对象有三个参数,第一个获取Activity;第二个参数设置方向,一般是VERTICAL,垂直滑动;第三个参数暂时用不到,写false就好。

代码如下:

private RecyclerView mRecyclerView;
    private List<String> mListView = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recycler_view);

        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
        getData();
        mRecyclerView.setAdapter(new MyAdapter(mListView));

    }
    //模拟数据
    private void getData(){
        for (int i = 0; i < 100; i++) {
            mListView.add("RecyclerView列表"+i);
        }
    }
......
}

    第三步中给RecyclerView添加适配器,这里需要注意的是RecyclerView类中已经提供了一个Adapter,所以我们不需要再使用BaseAdapter,同时Recycler还提供了一个内部的ViewHolder来进行优化。可以看到RecyclerView在Adapter中提供了三个重写方法onCreateHolderView、onBindHolderView、getItemCount,另外如果有需要还可以重写getItemViewType方法。从方法名字不难看出,onCreateViewHolder用于创建视图,onBindHolderView用户绑定数据,getItemCount用户获取项的数量。getItemViewType可以用于定制列表头部和尾部布局的时候使用,返回视图类型。


    private static class ViewHolder extends RecyclerView.ViewHolder{
        private TextView mTxt;
        public ViewHolder(View itemView) {
            super(itemView);
            mTxt = (TextView) itemView.findViewById(R.id.item_txt);
        }
    }

    private class MyAdapter extends RecyclerView.Adapter<ViewHolder>{
        private List<String> mList;

        public MyAdapter(List<String> mList) {
            this.mList = mList;
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View viewPager = getLayoutInflater().inflate(R.layout.item_list,parent,false);
            ViewHolder mViewHolder = new ViewHolder(viewPager);
            return mViewHolder;
        }
        
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            holder.mTxt.setText(mList.get(position));

        }

        @Override
        public int getItemCount() {
            return mList.size();
        }
    }

           保存代码运行即可实现列表效果,如图

  

 

        项目下载地址:https://github.com/fanKarl/recyclerview-master.git

        在项目里我做了三种效果,第一种就是上边所讲方法;第二种则是列表头部自定制,如下图所示;第三种则是把RecyclerView的方法抽象成父类,由子类去继承,节约开发成本。

        

 

这里只是RecyclerView的简单介绍,如果大家想看具体的介绍,网上也是很有很多的,这里推荐一篇Blog,Frank-Zhu的RecyclerView使用详解

http://frank-zhu.github.io/android/2015/01/16/android-recyclerview-part-1/

 

补充----------------------------------------------------------------------

我写了一个带有刷新和点击事件的Demo。下载路径如下:

https://github.com/fanKarl/recyclerview-and-refresh-master

 

 

© 著作权归作者所有

共有 人打赏支持
公子彦
粉丝 2
博文 11
码字总数 6260
作品 0
程序员
加载中

评论(2)

莱特大心
火钳刘明
莱特大心
沙发
赵彦军/RecyclerView

RecyclerView RecyclerView不再负责显示工作,用法比ListView更解耦。和ListView不一样的是,RecyclerView不再负责Item的摆放等显示方面的功能。所有和布局、绘制等方面的工作Google都其拆分成...

赵彦军
2016/12/02
0
0
KnightGuard/VolleyDisposeDemo

VolleyDisposeDemo 基于Material风格的简单美女图库,主要技术点有Volley的二次封装,简化了请求步骤,优化了执行代码。另兼容了4.4以上的状态栏沉浸,卡片式布局、DrawerLayout、SwipeRefr...

KnightGuard
2015/10/17
0
0
【Android】详解7.0带来的新工具类:DiffUtil

本篇文章已授权微信公众号 hongyangAndroid (鸿洋)独家发布 转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52562770 本文出自:【张旭童的博客】 (http://blog.csdn.net/...

zxt0601
2016/09/17
0
0
Android基础控件——RecyclerView实现混排效果,仿网易云音乐

本篇文章已授权微信公众号 study_tech(杨守乐)独家发布转载请标明出处 前言 最近在使用网易云音乐的时候,看到如下图的排版效果图,自己也想实现一个 这里采用网上用法最多的方式,而且是比...

qq_30379689
2017/10/29
0
0
【Android】快速开发偷懒必备(二) 支持DataBinding啦~爽炸,一行实现花式列表

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请标明出处: http://blog.csdn.net/zxt0601/article/details/53618694 本文出自:【张旭童的博客】(http://blog.csdn.net/zxt06...

zxt0601
2016/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python标准输入输出

input() 读取键盘输入 input() 函数从标准输入读入一行文本,默认的标准输入是键盘。 input 可以接收一个Python表达式作为输入,并将运算结果返回。 print()和format()输出 format()输出...

colinux
23分钟前
0
0
Python 核心编程 (全)

浅拷贝和深拷贝 1.浅拷贝:是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。相当于把变量里面指向的一个地址给了另一个变量就是浅拷贝,而没有创建一个新的对象,如a...

代码打碟手
35分钟前
0
0
PHP 对象比数组省内存?错!数组比对象省内存?错!

刚刚一个群里有人引出了 PHP 数组和对象占用内存谁多谁少的问题。我想起之前我好像也测试过这个问题,和群里人说的对象比数组节省内存的结论相反,我得出的是数组比对象节省内存。 但今天,我...

宇润
52分钟前
1
0
memcached命令行及其用法

21.5 memcached命令行 创建数据 yum install -y telnet 利用telnet命令连接memcached数据库 telnet 127.0.0.1 11211 #写入数据 set key2 0 30 212STORED 这个是错误的示范,因为0 30 已经...

lyy549745
52分钟前
0
0
Maven私服

Maven私服 一、简介 当多人项目开发的时候,尤其聚合项目开发,项目和项目之间需要有依赖关系,通过maven私服,可以保存互相依赖的jar包,这样的话就可把多个项目整合到一起。 如下图: Inst...

星汉
55分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部