RecyclerView是一个非常好用的控件,它的效果和ListView很相似,甚至可以说RecyclerView的出现是来取代ListView的

RecyclerView比ListView更加灵活,具有更高的扩展性

下面就详细的介绍RecyclerView的用法

既然RecyclerView上来取带ListView的那说明RecyclerView和ListView的用法很相似,事实确实这样,也就是两个东西,一个控件和适配器(Adapter)

一:导包

我这里开发使用的AndroidStudio,再使用RecyclerView之前要先引入RecyclerView的包(这个是必须的,也是不用解释的)

在build文件中找到dependencies代码块,添加compile 'com.android.support:recyclerview-v7:23.0.0'这句话,重新构建项目就可以使用RecyclerView了

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:recyclerview-v7:23.0.0'
}

二:写xml文件

做完上面的工作就可以开始写代码了,首先创建一个Activity同时生成xml布局文件,在布局文件中写入RecyclerView控件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView>
</RelativeLayout>

再写上面的代码是RecyclerView的时候不能直接写RecyclerView,必须加上前面的android.support.v7.widget,如果记不起前面的内容,给你说一种简便方法,现在Activity中声明一个变量RecyclerView

可以看到声明了RecyclerView之后上面的import就会自动生成,import后面的内容就是RecyclerView的全路径了。

三:写适配器类

首先创建一个类继承自RecyclerView.Adapter

相信在ListView中已经很熟悉ViewHolder这个类了,在RecyclerView的Adapter中ViewHolder内置了,所以先不要管什么,必须先写一个ViewHolder内部类继承自RecyclerView.ViewHolder,重写构造函数,这个时候先不要急实现Adapter的抽象方法

public class MyRecyclerViewAdapter extends RecyclerView.Adapter {

    class MyViewHolder extends RecyclerView.ViewHolder{

        public MyViewHolder(View itemView) {
super(itemView);
}
}
}

做完上面的再去将我们写的ViewHolder给Adapter绑上,就是RecyclerView.Adapter后面尖括号的内容

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {

    class MyViewHolder extends RecyclerView.ViewHolder{

        public MyViewHolder(View itemView) {
super(itemView);
}
}
}

昨晚上面的步骤再去实现Adapter的抽象方法

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    @Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
return null;
} @Override
public void onBindViewHolder(MyViewHolder myViewHolder, int i) { } @Override
public int getItemCount() {
return 0;
} class MyViewHolder extends RecyclerView.ViewHolder{ public MyViewHolder(View itemView) {
super(itemView);
}
}
}

如果先去实现了上面的抽象方法,不先做上面的步骤你会很麻烦,甚至可能会思维混乱不知所措

这样这个Adapter类基本成型了,下面来介绍这些方法的作用

首先onCreateViewHolder()这个方法看名字就知道是用来创建ViewHolder类的,上面虽然写出了ViewHolder类但是还没有生成实例,也就是new的过程所以这个方法就是用来new ViewHolder的,看myViewHolder有一个构造方法,构造方法里面有一个View的对象,所以在这里创建ViewHolder的时候要传入一个参数,这里的这个View很简单就是你RecyclerView的每一项的View的对象,用LayoutInflater加载,最后返回ViewHolder

其次onBinderViewHolder();这里面有两个参数MyViewHolder myViewHolder 你生成的ViewHolder实例, int i 代表目前是哪一行,所以这个方法是来给ViewHolder里面的控件赋值的

再看getItemCount();就是确定你这个RecyclerView有多少行

MyViewHolder是初始化每一行空间的地方

将上面的方法都实现就形成了下面的Adapter类

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private List<String> mList;
private Context context;
public MyAdapter(List<String> mList,Context context){
this.mList = mList;
this.context = context;
}
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.item,viewGroup,false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
} @Override
public void onBindViewHolder(MyViewHolder myViewHolder, int i) {
myViewHolder.tv_msg.setText(mList.get(i));
} @Override
public int getItemCount() {
return mList.size();
} class MyViewHolder extends RecyclerView.ViewHolder{
TextView tv_msg;
public MyViewHolder(View itemView) {
super(itemView);
tv_msg = (TextView) itemView.findViewById(R.id.tv_msg);
}
}
}  

四:最后Activity里面的内容 

在Activity里面的内容就很简单了,也就是setAdapter了,值得提提的是除了设置Adapter,在RecyclerView里面有一个LayoutManager的东西,这也是RecyclerView扩展性高的主要原因

代码如下

public class MainActivity extends Activity {

    private RecyclerView recyclerView;
private List<String> mList ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
function(); } private void function() {
mList = new ArrayList<>();
for (int i = 0 ; i < 20 ; i++){
mList.add("Hello"+i);
} MyAdapter adapter = new MyAdapter(mList,this);
LinearLayoutManager llm = new LinearLayoutManager(this,0,false);
recyclerView.setLayoutManager(llm);
recyclerView.setAdapter(adapter);
} private void initView() {
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
} }

解释一下,首先通过findViewById找到RecyclerView

然后初始化List

然后生成Adapter实例

接下来生成LayoutManager的对象

最后设置LayoutManager和Adapter。

五:最后

解释一下LayoutManager

RecyclerView的LayoutManager有三种,常用的有两种,这里接介绍下常用的两种

第一种LinearLayoutManager

这个一看就知道线性布局管理,构造方法有三个参数,第一个上下文对象(不描述),第二个是一个int型的参数(只能是0和1)0代表横向,1代表纵向,第三个参数Boolean表示顺序还是倒序

false代表顺序,true代表倒序;这种布局管理器的效果和ListView的效果是一样的一行只能放一个item

第二种GridLayoutManager

这个一看就知道是网格布局管理器,也就是说用这种管理器可在一行放多个item,它有两个参数;第一个上下文对象化,第二个int型表示一行放的item的个数(1:表示一行放一个item;2:表示一行放2个item)

安卓开发之RecyclerView的更多相关文章

  1. 安卓开发之Toolbar

    根据官网的教程,发现实现与预期不一致,查看相关资料自己整理了一下(官网开发文档:https://developer.android.com/training/appbar/setting-up.htm ...

  2. 安卓开发之ListAdapter(二)

    今天我们来学习一下ArrayAdapter: ArrayAdapter是安卓中最简单的适配器.使用ArrayAdapter(数组适配器),需要把数据源存 放至数组里面来显示. •构造函数: publi ...

  3. 安卓开发之UIwebview

    web view在安卓开发中是比较常见的UI,像微信的新闻模块就采用了这个,他的作用越来越广,下面我把以前做的贴了出来,如果有更好的办法,希望大神不吝赐教哈,嘿嘿,纯代码来了: java代码 publ ...

  4. 安卓开发之activity详解(sumzom)

    app中,一个activity通常是指的一个单独的屏幕,相当于网站里面的一个网页,它是对用户可见的,它上面可以显示一些控件,并且可以监听处理用户的时间做出响应. 那么activity之间如何进行通信呢 ...

  5. 安卓开发之ListAdapter(一)

    Adapter常用来管理数据,是连接后端数据和前端显示的适配器接口,是数据和UI(view)之间一个重要的纽带.再常见的view(listview.gridview)等地方都需要用到adapter,下 ...

  6. 安卓开发之json解析

    1.从网页获取json返回字符串 public class ReadNet extends AsyncTask<URL, Integer, String> { @Override      ...

  7. 安卓开发之viewpager学习(头条显示)

    activity_luancher.xml代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res ...

  8. 安卓开发之APK安装之后自动在桌面上创建快捷图标

    可以看到很多的APP在第一次运行之后就会弹出来一个Toast说什么快捷方式已创建,那么这个东西是怎么搞出来的呢 很简单就下面几句话,写在这儿以后好copy 先创建一个类 import android. ...

  9. 安卓开发之mqtt协议

    首先物联网协议mqtt协议是基于tcp/ip协议的,使用了官方的mqttclient框架/**初始化mqttclient*/private void init() { try { //MQTT的连接设 ...

随机推荐

  1. 【Android】使用FrameLayout布局实现霓虹灯效果

    FrameLayout是五大布局中最简单的一个布局. 在这个布局中,整个界面被当成一块空白备用区域,所有的子元素都不能被指定放置的位置. 它们统统放于这块区域的左上角,并且后面的子元素直接覆盖在前面的 ...

  2. 【转】关于ios10中ATS的问题

    原文连接:https://onevcat.com/2016/06/ios-10-ats/ WWDC 15 提出的 ATS (App Transport Security) 是 Apple 在推进网络通 ...

  3. 获得创建临时表的session id

    通过sql server的default trace和tempdb中的sys.objects视图,你能够获得创建临时表的session id,下面是相应的sql语句: DECLARE @FileNam ...

  4. 【SSH进阶之路】Hibernate基本原理(一)

    在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装.一句不难,难道是真的不难还是眼高手低? 如果只是停留在使用的层面上,我相信什么技术都不难,看看别人怎 ...

  5. Unique Binary Search Trees,Unique Binary Search Trees II

    Unique Binary Search Trees Total Accepted: 69271 Total Submissions: 191174 Difficulty: Medium Given  ...

  6. redis怎么动态添加内存,动态配置,无需重启。

    在redis的使用过程中,有时候需要急需修改redis的配置,比如在业务运行的情况下,内存不够怎么办,这时要么赶紧删除无用的内存,要么扩展内存.如果有无用的内容可删除那么所有问题都已经解决.如果内容都 ...

  7. python运维开发(十)----IO多路复用线程基本使用

    内容目录: python作用域 python2.7和python3.5的多继承区别 IO多路复用 socketserver模块源分析 多线程.进程.协程 python作用域  python中无块级作用 ...

  8. Leetcode算法刷题:第14题 Longest Common Prefix

    Longest Common Prefix 题目 给予一个列表,元素为字符串,写一个程序找出最长公共前缀 解题思路 先比较两个字符串,如果第一个字符不一样,则返回空值,比较完成后,用这个公共字符串和下 ...

  9. 寻找最大数--nyoj题目448

    寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=920813467185 ...

  10. 1001 A + B Problem

    基本输入输出函数 #include <stdio.h> int main(){ int a,b; ){ printf("%d\n",a+b); } ; }