•RecyclerView基本用法

  RecyclerView是新增的控件,为了让 RecyclerView 在所有 Android 版本上都能使用;

  Android 团队将 RecyclerView 定义在了 support 库中。

  因此,想要使用 RecyclerView 这个控件,首先需要在项目的 build.gradle 中添加相应的依赖库才行。

  参考我的这篇博客:Android Studio 有关 RecycleView 的使用

  新建一个 Empty Activity,并在 activity_main.xml 中添加如下代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_fruit"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>

  需要注意的是,由于 RecyclerView 并不是内置在系统 SDK 中的,所以需要把完整的包路径写出来。

•为RecyclerView添加适配器

  新建 Fruit 类,代码如下:

public class Fruit {
private String name;//名称
private int imgId;//对应图片id public Fruit(String name,int imgId){
this.name = name;
this.imgId = imgId;
} public String getName() {
return name;
} public int getImgId() {
return imgId;
}
}

  Fruit 类中只有两个字段,name 表示水果名称,imgId 表示水果对应图片的资源 id。

  然后需要为 ListView 的子项指定一个我们自定义的布局;

  在 layout 目录下新建 fruit_item,添加代码如下:

<?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="horizontal"
android:padding="10dp">
<!-- 注意根布局的 layout_width 和 layout_height 属性的参数
如果设置成 martch_parent,那么每个列都会占满一个屏幕-->
<ImageView
android:id="@+id/fruit_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> <TextView
android:id="@+id/fruit_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textColor="@color/black"
android:textSize="20sp" /> </LinearLayout>

  在这个布局中,我们定义了一个 ImageView 用来显示图片,又定义了一个 TextView 用来显示名称。 

  接下来需要创建一个自定义的适配器,这个适配器继承自 RecyclerView.Adapter,并将泛型指定为 FruitAdapter.ViewHolder。

  ViewHolder 是 FruitAdapter 中定义的一个内部类,代码如下:

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder>{

    private List<Fruit> list;///数据源

    /**
* 首先定义了一个内部类 ViewHolder,继承自 RecyclerView.ViewHolder
* 然后 ViewHolder 的构造函数中要传入一个 View 参数
* 这个参数通常就是 RecyclerView 子项的最外层布局(fruit_item.xml)
* 最后,通过 findViewById() 方法来获取到布局中的 ImageView 和 TextView 的实例
*/
static class ViewHolder extends RecyclerView.ViewHolder{
ImageView img;
TextView name; public ViewHolder(@NonNull View view) {
super(view);
img = view.findViewById(R.id.fruit_img);
name = view.findViewById(R.id.fruit_name);
}
} /**
* 该方法用于把要展示的数据源传进来,并赋值给变量 list
* 后续操作都将在这个数据源的基础上进行
*/
public FruitAdapter(List<Fruit> list){
this.list = list;
} /**
* onCreateViewHolder()方法用于创建 ViewHolder 实例
* 在这个方法中,将 fruit_item 布局加载进来,然后创建一个 ViewHolder 实例
* 并把加载出来的布局传入到构造函数中,最后将 ViewHolder 实例返回
*/
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
ViewHolder holder = new ViewHolder(view);
return holder;
} /**
* onBindViewHolder() 方法用于对RecyclerView 子项的数据进行赋值
* 会在每个子项被滚动到屏幕内的时候执行
* 这里通过 position 参数得到当前项的 Fruit 实例
* 然后再将数据设置到 ViewHolder 的 ImageView 和 TextView 当中
*/
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Fruit fruit = list.get(position);
holder.img.setImageResource(fruit.getImgId());
holder.name.setText(fruit.getName());
} /**
* 返回数据源的长度
* 用来告诉 RecyclerView 一共有多少子项
*/
@Override
public int getItemCount() {
return list.size();
}
}

说明

  虽然这段代码看上去有点长,但其实他比 ListView 的适配器要更容易理解;

  这里首先,我们定义了一个内部类 ViewHolder,ViewHolder 要继承自 RecyclerView.ViewHolder。

  然后,ViewHolder 的构造函数中要传入一个 View 参数,这个参数通常就是 RecyclerView 子项的最外层布局;

  那么,我们可以通过  findViewById() 方法来获取到布局中的  ImageView 和 TextView 的实例了。

  接着往下看,FruitAdapter 中也有一个构造函数;

  这个方法用于把要展示的数据传进来,并赋值给一个全局变量 list,我们后续的操作都将在这个数据源上进行。

  继续往下看,由于 FruitAdapter 继承自 RecyclerView.Adapter;

  那么就必须重写  onCreateViewHolder() , onBindViewHolder() 和 getItemCount() ;

  • onCreateViewHolder() 方法是用于创建 ViewHolder 实例的

    • 在这个方法中,将 fruit_item 布局动态加载进来
    • 然后创建一个 ViewHolder 实例,并把加载出来的布局传入到构造函数中
    • 最后将 ViewHolder 的实例返回
  • onBindViewHolder() 方法是用于对 RecyclerView 子项的数据进行赋值的

    • 会在每个子项被滚动到屏幕内的时候执行
    • 这里我们通过 positon 参数得到当前项的 Fruit 实例,然后再将数据设置到 ViewHolder 的 ImageView 和 TextView 中
    • Bind 的字面意思就是捆绑,这个方法我们也可以理解成将数据与布局捆绑在一起
    • fruit.getImgId() <-> holder.img
    • fruit.getName() <-> holder.name
  • getItemCount() 方法用于告诉 RecyclerView 一共有多少子项

    • 直接返回数据源的长度就可以了

  适配器准备好了之后,就可以开始使用 RecyclerView 了,修改 MainActivity 中的代码,如下所示:

public class MainActivity extends AppCompatActivity {

    private RecyclerView rv;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); rv = findViewById(R.id.rv_fruit); /*LayoutManager 用于指定 RecyclerView 的布局方式
这里使用的 LinearLayoutManager 是线性布局
可以实现和 ListView 类似的效果*/
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
rv.setLayoutManager(layoutManager); FruitAdapter adapter = new FruitAdapter(getData());
rv.setAdapter(adapter);
} private List<Fruit> getData() {
List<Fruit> list = new ArrayList<>(); list.add(new Fruit("apple", R.drawable.apple));
list.add(new Fruit("banana", R.drawable.banana));
list.add(new Fruit("oranges", R.drawable.oranges)); return list;
} }

•运行效果

  

Android学习之RecyclerView初探究的更多相关文章

  1. Android学习之RecyclerView

    RecyclerView是android-support-v7-21版本号中新增的一个Widget,官方介绍RecyclerView 是 ListView 的升级版本号,更加先进和灵活. 开发环境 - ...

  2. android 学习之RecyclerView

    RecyclerView:ListView的升级版,它提供了更好的性能而且更容易使用.该控件是一个可以装载大量的视图集合,并且可以非常效率的进行回收和滚动.当你list中的元素经常动态改变时可以使用R ...

  3. Android学习——利用RecyclerView编写聊天界面

    1.待会儿会用到RecyclerView,首先在app/build.gradle(注意有两个build.gradle,选择app下的那个)当中添加依赖库,如下: dependencies { comp ...

  4. Android学习之服务初体验

    •概念 Service(服务)是一个长期运行在后台,没有用户界面的应用组件,即使切换到另一个应用程序或者后台,服务也可以正常运行: 因此,服务适合执行一些不需要显示界面的后台耗时操作,比如下载网络数据 ...

  5. Android学习之Broadcast初体验

    •何为 Broadcast ? Broadcast 直译广播,接下来举个形象的例子来理解下 Broadcast: 上学的时候,每个班级都会有一个挂在墙上的大喇叭,用来广播一些通知,比如,开学要去搬书, ...

  6. Android学习路线总结,绝对干货

    title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一.前言 不 ...

  7. (转)Android学习路线总结,绝对干货

    一.前言 不知不觉自己已经做了几年开发了,由记得刚出来工作的时候感觉自己能牛逼,现在回想起来感觉好无知.懂的越多的时候你才会发现懂的越少. 如果你的知识是一个圆,当你的圆越大时,圆外面的世界也就越大. ...

  8. Android学习路线总结,绝对干货(转)

    转自:https://www.cnblogs.com/yishaochu/p/5436094.html 一.前言 不知不觉自己已经做了几年开发了,由记得刚出来工作的时候感觉自己能牛逼,现在回想起来感觉 ...

  9. Android学习路线总结,绝对干货(转)

    title: Android学习路线总结,绝对干货tags: Android学习路线,Android学习资料,怎么学习androidgrammar_cjkRuby: true--- 一.前言 不知不觉 ...

随机推荐

  1. Apple 产品反人类的设计 All In One

    Apple 产品反人类的设计 All In One 用户体验 shit rank WTF rank iPhone 更换铃声 WTF, 这么简单的一个功能搞得太复杂了 使用要下载 1.6 G的库乐队 A ...

  2. js console.log color all in one

    js console.log color all in one console.log color Chrome console.log 语法 / grammar %c, %s, css style ...

  3. Redis in Action

    Redis in Action Redis REmote DIctionary Server(Redis) Redis 是一种开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理. ...

  4. js online playground & web editor

    js online playground & web editor -javascript playgrounds 2019 https://scotch.io/tutorials/7-jav ...

  5. element ui 停止维护了

    ️‍♂️ element ui 停止维护了 最近看到有人说 element ui 已经停止维护了,还有点不相信; 不过到 github 验证一下,好像是真的呀 4 个月,没有任何更新了 https:/ ...

  6. 关于TCP的Total Length

    TCP/IP传输层 文档 随便找了个发送的TCP: 70 89 cc ee 84 2c 3c 2c 30 a6 a2 d0 08 00 45 00 00 4c c7 a8 40 00 80 06 00 ...

  7. Simple: SQLite3 中文结巴分词插件

    一年前开发 simple 分词器,实现了微信在两篇文章中描述的,基于 SQLite 支持中文和拼音的搜索方案.具体背景参见这篇文章.项目发布后受到了一些朋友的关注,后续也发布了一些改进,提升了项目易用 ...

  8. 08_MySQL数据库的字段约束

    数据库的字段约束 实战: CREATE TABLE t_teacher ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) N ...

  9. 运用Spock编写高质量单元测试

    单元测试作为提升代码质量的有效方法,目前在国内各大互联网公司的开发团队中,尤其是业务团队中却鲜少被使用.这主要由于大家对于单元测试有一些认知错误,或者没有正确的打开方式.至今我们团队在小剧场.零代码运 ...

  10. WPF权限控制框架——【4】抛砖引玉

    写第一篇"权限控制框架"系列博客是在2021-01-29,在这不到一个月的时间里,收集自己零碎的时间,竟然写出了一个"麻雀虽小,五脏俱全"的权限控制框架:对于一 ...