我的编程空间,编程开发者的网络收藏夹
学习永远不晚

学习Android开发之RecyclerView使用初探

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

学习Android开发之RecyclerView使用初探

在进行一些MaterialDesign规范开发的时候,比如之前说到的CoordinateLayout实现的向上折叠效果的时候,如果依然使用ListView,那么这种效果是做不出来的,因为ListView不兼容这个控件,而替代它的就是RecyclerView。
和ListView的区别: 

①RecyclerView只关心item的重用和缓存 
②RecyclerView不关心item的分隔风格(交给ItemDecoration) 
③RecyclerView不关心item的动画(交给ItemAnimator) 
④RecyclerView不关心item的布局(交给LayoutManager) 
本文为初探,所以先不详解②③④这几个内容,先记录一下用法和遇到的坑,后续有时间再更新! 
先放一下效果图,动画效果在之前的博客也有提到,可以参考,主要的是中间的RecyclerView,这里主要讲如何使用它以及遇到的一些问题

 

先添加依赖,版本无所谓:
 compile 'com.android.support:recyclerview-v7:23.1.1'
布局文件如下,注意最后一个属性可以不用理,这是用来协调动画效果的(就是把上面图片推上去的效果)


<android.support.v7.widget.RecyclerView
android:id="@+id/main_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

自定义一个Adapter继承自RecyclerView.Adapter,代码如下:


public class MyAdapter extends RecyclerView.Adapter {
  private static final String TAG = "MyAdapter";
  private final List<Map<String, Object>> data;
  private final View root;
  private OnItemButtonCLickListener listener;
  public MyAdapter(List<Map<String, Object>> data, View root) {
    this.data = data;
    this.root = root;
  }
  public void setOnItemButtonClickListener(OnItemButtonCLickListener listener){
    this.listener = listener;
  }
  class ViewHolder extends RecyclerView.ViewHolder {
    TextView reason, money, date;
    Button delete,alter;
    public ViewHolder(View itemView) {
      super(itemView);
      reason = (TextView) itemView.findViewById(R.id.main_rv_item_reason);
      money = (TextView) itemView.findViewById(R.id.main_rv_item_money);
      date = (TextView) itemView.findViewById(R.id.main_rv_item_date);
      delete = (Button) itemView.findViewById(R.id.main_rv_item_remove);
      alter = (Button) itemView.findViewById(R.id.main_rv_item_alter);
    }
  }
  @Override
  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    ViewHolder vh = new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout
        .main_lv_item, null));
    return vh;
  }
  @Override
  public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
    final ViewHolder vh = (ViewHolder) holder;
    vh.date.setText(data.get(position).get("date").toString());
    vh.reason.setText(data.get(position).get("reason").toString());
    vh.money.setText(data.get(position).get("money").toString());
    vh.delete.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Snackbar snackBar = Snackbar.make(root, "Are you sure to delete it?", Snackbar.LENGTH_LONG);
        snackBar.setAction("YES", new MyOnClickListener(vh.getLayoutPosition()));
        snackBar.show();
      }
    });
    vh.alter.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        listener.OnItemAlter(vh.getLayoutPosition());
      }
    });
  }
  @Override
  public int getItemCount() {
    return data.size();
  }
  private class MyOnClickListener implements View.OnClickListener {
    private final int position;
    public MyOnClickListener(int position) {
      this.position = position;
    }
    @Override
    public void onClick(View v) {
      listener.OnItemDelete(position);
    }
  }
  interface OnItemButtonCLickListener {
    void OnItemAlter(int position);
    void OnItemDelete(int position);
  }
}

解析:构造方法中获取到数据源以及根View,根View用来显示SnackBar,如果不知道SnackBar,请看上一篇。然后创建一个内部类,继承自RecyclerView.ViewHolder,用它来保存每一个Item的全部控件。接下来重写几个方法:getItemCount、onBindViewHolder以及onCreateViewHolder,他们分别是返回item个数,绑定ViewHolder以及创建ViewHolder,创建ViewHolder就是通过Item的布局文件获取每个控件的实例,绑定ViewHolder就是把数据源中的数据映射到Item的控件中,因为我们的Item中还有删除和修改按钮,所以我们为它们添加点击事件也是在onBindViewHolder中进行。接下来我们定义一个接口OnItemButtonClickListener并且定义两个方法分别用来回调点击删除和修改,并创建接口的对象,在按钮点击的时候分别调用接口的两个方法,并传入点击的item的position。
Activity部分代码如下:


 rv = (RecyclerView) findViewById(R.id.main_lv);
adapter = new MyAdapter(data, root);
rv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)); 
// 设置布局,否则无法正常使用
adapter.setOnItemButtonClickListener(this);
rv.setAdapter(adapter);

@Override
  public void OnItemAlter(int position) {
    //Intent intent = new Intent(MainActivity.this, AlterActivity.class);
    //intent.putExtra("id", Integer.parseInt(data.get(position).get("id").toString()));
    //intent.putExtra("date", data.get(position).get("date").toString());
    //intent.putExtra("money", data.get(position).get("money").toString());
    //intent.putExtra("reason", data.get(position).get("reason").toString());
    //startActivityForResult(intent, REQUEST_ALTER);
  }
  @Override
  public void OnItemDelete(int position) {
    Log.d(TAG, "OnItemDelete() called with: " + "position = [" + position + "]");
    //Map<String, Object> backup = data.get(position);
    //data.remove(position);
    //database.execSQL("delete from tally where id=?", new String[]{backup.get
    //    ("id").toString()});
    adapter.notifyItemRemoved(position);
  }

解析:获取RecyclerView的实例之后,设置对应的布局管理器,然后通过setOnItemButtonClickListener设置回调函数并实现,最后给RecyclerView设置adapter即可。
遇到的问题:
 ①刚开始忘记设置布局,RecyclerView不显示出来
 ②因为我们在删除item之后调用了notifyItemRemoved方法来显示动画并刷新,在onBindViewHolder中,对删除按钮监听之后调用接口方法的时候传入了position,这个position是错误的,因为在绑定的时候固定了,如果数据源的数据被删除了,数据源的size会变小,这个position就不再对应于数据源的每一个项就会产生混乱,所以这里应该传入viewholder.getLayoutPosition()所得到的值,这个值是对应点击而产生的。
 ③如果在RecyclerView的第一项前面插入一个item,并且调用notifyItmeInserted(0),是不会播放动画效果的。

您可能感兴趣的文章:Android RecyclerView 基础知识详解Android RecyclerView加载不同布局简单实现Android添加图片到ListView或者RecyclerView显示Android中RecyclerView实现横向滑动代码Android RecyclerView详解之实现 ListView GridView瀑布流效果Android中RecyclerView点击Item设置事件Android RecyclerView艺术般的控件使用完全解析Android代码实现AdapterViews和RecyclerView无限滚动Android RecyclerView滑动删除和拖动排序Android RecyclerView的Item自定义动画及DefaultItemAnimator源码分析Android开发中RecyclerView组件使用的一些进阶技讲解Android RecyclerView 数据绑定实例代码


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

学习Android开发之RecyclerView使用初探

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

学习Android开发之RecyclerView使用初探

在进行一些MaterialDesign规范开发的时候,比如之前说到的CoordinateLayout实现的向上折叠效果的时候,如果依然使用ListView,那么这种效果是做不出来的,因为ListView不兼容这个控件,而替代它的就是Recy
2022-06-06

Android开发笔记之Intent初级学习教程

本文讲述了Android开发笔记之Intent初级学习教程。分享给大家供大家参考,具体如下: 项目创建步骤: New Android Project-> Project name:Intent Build Target:Android 2.
2022-06-06

Android开发 - RecyclerView的使用

RecyclerView简单布局的使用 代码部分 RcvClickActivity.java package com.haocent.android.recyclerview.click; import android.os.Bundle;
2022-06-06

谈谈Android开发之RecyclerView的使用全解

自Android 5.0之后,谷歌公司推出了RecylerView控件,RecylerView,我想看到一个新名词后大部分人会首先发出一个疑问,recylerview是什么?为什么会有recylerview也就是说recylerview的优
2022-06-06

Android Studio开发(二)使用RecyclerView

Android Studio开发(二)使用RecyclerViewAndroid Studio开发(二)RecyclerView一、任务需求二、Recycler View梳理1. Fragment, Adapter, RecyclerVie
2022-06-06

Android开发艺术探索学习笔记(七)

第七章 Android动画深入分析 Android的动画分为三种:View动画,帧动画,属性动画。帧动画属于View动画。 7.1 View动画View动画的作用对象是View,共有四种动画效果:平移(Translate),缩放(Scal
2022-06-06

Python深度学习之Pytorch初步使用

目录一、Tensor二、Pytorch如何创建张量2.1 创建张量2.2 tensor与ndarray的关系2.3 常用api2.4 常用方法三、数据类型3.1 获取数据类型四、tensor的其他操作4.1 相加4.2 tensor与数字的
2022-06-02

Android游戏开发学习之引擎用法实例详解

本文实例讲述了Android游戏开发学习之引擎用法。分享给大家供大家参考。具体如下: 汽车引擎是汽车的心脏,其决定了汽车的性能和稳定性,是人们在购车时相当关注的。而游戏中的物理引擎就如汽车的引擎一样,占据了非常重要的位置。一款好的物理引擎可
2022-06-06

Android学习之Broadcast的简单使用

本文实例为大家分享了Android学习之Broadcast的使用方法,供大家参考,具体内容如下实现开机启动提示网络的广播package com.example.luobo.broadcasttest;import android.conte
2023-05-30

Android App开发中使用RecyclerView替代ListView的实践

RecyclerView是Android 5.0的新特性,可以直接代替ListView与GridView,并且能够实现瀑布流的布局,感觉RecyclerView使用的好处就是它不关心布局,只关心资源的回收与复用,正因为如此,Recycler
2022-06-06

Android应用开发中RecyclerView组件使用入门教程

RecyclerView是一种列表容器, 发布很久了, 才想起来写点什么. RecyclerView相比于ListView, 在回收重用时更具有灵活性, 也就是低耦合, 并且提供了扩展. 加载多个视图时, 应该多用RecyclerView代
2022-06-06

Python学习之使用Python发送邮

最近写的检查redis配置的脚本中需要增加一个发送邮件的功能,于是现学现用了python的邮件发送模块smtplib.可以参考《Python for Unix and Linux Administrator》一书#/usr/bin/pyth
2023-01-31

Android应用开发中使用Fragment的入门学习教程

Fragment是Android honeycomb 3.0开始新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法。Fragment用来描述一些行为或一部分用户界
2022-06-06

21天学习android开发教程之SQLite分页读取

Android包含了常用于嵌入式系统的SQLite,免去了开发者自己移植安装的功夫。SQLite 支持多数 SQL92 标准,很多常用的SQL命令都能在SQLite上面使用,除此之外Android还提供了一系列自定义的方法去简化对SQLit
2022-06-06

Android App开发中RecyclerView控件的基本使用教程

概述 RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用。 据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView、G
2022-06-06

Android开发之PreferenceActivity的使用

PreferenceActivity是Android中的一个特殊的Activity,用于展示和管理应用程序的偏好设置。通过PreferenceActivity,开发者可以很方便地创建一个设置界面,并将用户的偏好设置保存到SharedPref
2023-09-28

21天学习android开发教程之XML解析与生成

本文使用SAX来解析XML,在Android里面可以使用SAX和DOM,DOM需要把整个XML文件读入内存再解析,比较消耗内存,而SAX基于事件驱动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结构简单的XML文档,复杂的XML文
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录