热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android使用RecyclerView实现自定义列表、点击事件以及下拉刷新

这篇文章主要介绍了Android使用RecyclerView实现自定义列表、点击事件以及下拉刷新的相关资料,需要的朋友可以参考下

Android使用RecyclerView

1. 什么是RecyclerView

RecyclerView 是 Android-support-v7-21 版本中新增的一个 Widgets,官方对于它的介绍则是:RecyclerView 是 ListView 的升级版本,更加先进和灵活。

简单来说就是:RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持。

2. 使用RecyclerView需要掌握什么

Adapter — 包装数据集合并且为每个条目创建视图
LayoutManager — 将每个条目的视图放置于适当的位置
OnItemClickListener — 给每个条目设置点击事件
SwipeRefreshLayout — 给RecyclerView添加下拉刷新事件
ItemAnimator — 在每个条目的视图的周围或上面绘制一些装饰视图
ItemDecoration — 在条目被添加、移除或者重排序时添加动画效果

3. 使用RecyclerView前需要准备什么

添加依赖包(以Android Studio为例)

 

4. 自定义Adapter

RecyclerView.Adapter包含了一种新型适配器,其实与以前我们使用的适配器基本类似,只是稍微有所不同,比如viewholder它帮我们封装好了,不用像以前使用listview的适配器一样自己去写viewholder了。

Item视图如下:

实例代码如下:

public class RecyclerAdapter extends RecyclerView.Adapter {

 private List models;

 public RecyclerAdapter(List models){
  this.models = models;
 }

 class ViewHolder extends RecyclerView.ViewHolder{

  private ImageView picture;
  private TextView title,text;

  public ViewHolder(View itemView) {
   super(itemView);

   picture = (ImageView) itemView.findViewById(R.id.picture);
   title = (TextView) itemView.findViewById(R.id.title);
   text = (TextView) itemView.findViewById(R.id.text);
  }

  public ImageView getPicture(){
   return picture;
  }

  public TextView getTitle(){
   return title;
  }

  public TextView getText(){
   return text;
  }
 }

 @Override
 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view,null));
 }

 @Override
 public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

  final ViewHolder vh = (ViewHolder) holder;
  vh.getPicture().setImageResource(models.get(position).getPicture());
  vh.getTitle().setText(models.get(position).getTitle());
  vh.getText().setText(models.get(position).getText());
 }

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

5. LayoutManager有什么作用

由于RecyclerView已经不单单像以前ListView或者GridView一样,它被作为ListView和GridView控件的继承者,所以在使用它的时候需要通过设置它的LayoutManager去规定它是哪一种类型,另外也可通过设置LayoutManager去设置它是横向还是纵向的列表,以及是否反转。

纵向列表:(第三个参数是设置是否反转,即滑动方向)

mLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
recyclerview.setLayoutManager(mLayoutManager);

横向列表:

mLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
recyclerview.setLayoutManager(mLayoutManager);

垂直表格布局:

mLayoutManager = new GridLayoutManager(this,2);
recyclerview.setLayoutManager(mLayoutManager);

水平表格布局:(第四个参数代表是否反转)

mLayoutManager = new GridLayoutManager(this,2,LinearLayoutManager.HORIZONTAL,false);
recyclerview.setLayoutManager(mLayoutManager);

6. 为什么要自己添加OnItemClickListener

RecyclerView有一个缺点,在RecyclerView中,没有一个onItemClickListener方法。所以目前在适配器中处理这样的事件比较好。如果想要从适配器上添加或移除条目,需要明确通知适配器。这与先前的notifyDataSetChanged()方法稍微有些不同。具体操作在适配器代码中就可以体现。

具体代码如下:

public class RecyclerAdapter extends RecyclerView.Adapter {

  private List models;

  public RecyclerAdapter(List models){
    this.models = models;
  }

  class ViewHolder extends RecyclerView.ViewHolder{

    private ImageView picture;
    private TextView title,text;

    public ViewHolder(View itemView) {
      super(itemView);

      picture = (ImageView) itemView.findViewById(R.id.picture);
      title = (TextView) itemView.findViewById(R.id.title);
      text = (TextView) itemView.findViewById(R.id.text);
    }

    public ImageView getPicture(){
      return picture;
    }

    public TextView getTitle(){
      return title;
    }

    public TextView getText(){
      return text;
    }
  }

  @Override
  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view,null));
  }

  @Override
  public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

    final ViewHolder vh = (ViewHolder) holder;
    vh.getPicture().setImageResource(models.get(position).getPicture());
    vh.getTitle().setText(models.get(position).getTitle());
    vh.getText().setText(models.get(position).getText());

    //如果设置了回调,就设置点击事件
    if (mOnItemClickListener != null){
      vh.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          mOnItemClickListener.onItemClick(vh.itemView,position);
        }
      });
    }
  }

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

  /**
   * ItemClick的回调接口
   */
  public interface OnItemClickListener{
    void onItemClick(View view,int position);
  }

  private OnItemClickListener mOnItemClickListener;

  public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener){
    this.mOnItemClickListener= mOnItemClickListener;
  }
}

7. 实现下拉刷新与上拉加载更多

其实跟以前一样,原生的ListView或者GridView都不能满足实际App的需要,很多时候都要通过自定义View去实现列表的下拉刷新和上拉加载,RecyclerView也是一样,不过这里不会介绍如何去自定义RecyclerView,相反,我们会借用SwipeRefreshLayout这个组件,更快地去实现列表刷新功能

界面布局如下:



    

    



设置下拉刷新监听事件:

swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
      @Override
      public void onRefresh() {
        //重新获取数据
        //获取完成swipeRefreshLayout.setRefreshing(false);
      }
});

设置上拉加载更多可以通过设置滑动监听事件来实现:

recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() {
      @Override
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (newState == RecyclerView.SCROLL_STATE_IDLE
            && lastVisibleItem + 1 == adapter.getItemCount()) {
          swipeRefreshLayout.setRefreshing(true);

          //分页获取数据
          //获取完成swipeRefreshLayout.setRefreshing(false);
        }
      }

      @Override
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
      }
    });

8. ItemAnimator 与ItemDecorator

由于RecyclerView里没有自带分割线,所以就出现了ItemDecorator,但其实还有另外一种方法,就是直接在Item界面布局中添加分割线,这样可以省去很多代码;
而ItemAnimator简单来说是会根据适配器上收到的相关通知去动画的显示组件的修改,添加和删除等。它会自动添加和移除item的动画。自带的默认效果也不错,已经非常好了。因为这两项不是很常用,所以这里就不多加介绍了,有兴趣的同学可以上网找详细的资料学习。


推荐阅读
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
author-avatar
手浪用户2602924633
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有