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

浅谈AndroidRecyclerViewUI的滚动控件示例

本篇文章主要介绍了浅谈AndroidRecyclerViewUI的滚动控件示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

ListView 由于其强大的功能,在过去的 Andorid 开发中使用非常广泛。不过 ListView 需要优化来提升运行效率,就像我们之前所优化的那样,否则性能将很差。还有就是只能够纵向滚动,如果要想实现横向移动,用 ListView 是做不到的。

RecyclerView 可以说是一个增强版的 ListView 。它不仅实现了和 ListView 同样的效果,而且还优化了 ListView 存在的各种不足。 RecyclerView 现在可是官方推荐使用的滚动控件哦O(∩_∩)O~

1 基本用法

RecyclerView 也是新增的控件,所以必须先在项目的 build.gradle 中添加相应的依赖库才能使用:

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

注意不要拼错哦O(∩_∩)O~

添加后,记得点击 Sync Now 链接哦。

接着,修改布局文件:

<&#63;xml version="1.0" encoding="utf-8"&#63;>


  


这里把宽度和高度都定义为 match_parent,这样 RecyclerView 就能占满整个屏幕。因为 RecyclerView 也不是系统内置的 SDK,所以这里引用的是完整的包路径。

然后为 RecyclerView 创建一个适配器(继承自 RecyclerView.Adapter ):

public class CatAdapter extends RecyclerView.Adapter {

  private List cats;

  static class ViewHolder extends RecyclerView.ViewHolder {
    ImageView image;
    TextView name;

    public ViewHolder(View view) {
      super(view);
      image = (ImageView) view.findViewById(R.id.image);
      name = (TextView) view.findViewById(R.id.name);
    }
  }

  public CatAdapter(List cats) {
    this.cats = cats;
  }


  @Override
  public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cat_item, parent, false);
    return new ViewHolder(view);
  }

  @Override
  public void onBindViewHolder(ViewHolder holder, int position) {
    Cat cat = cats.get(position);
    holder.image.setImageResource(cat.getImageId());
    holder.name.setText(cat.getName());
  }

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

在代码中,我们先定义了一个内部类 ViewHolder,它继承自 RecyclerView.ViewHolder。然后在 ViewHolder 的构造函数中传入一个 View 参数,它是 RecyclerView 子项的最外层布局,所以我们可以通过它来取得布局中的 ImageView 和 TextView 的实例。

CatAdapter 的构造函数用于把要展示的数据源传递进来,并赋值给一个类变量 cats。

因为 CatAdapter 继承自 RecyclerView.Adapter,所以必须重写以下三个方法:

  1. onCreateViewHolder - 创建 ViewHolder 实例,我们把 cat_item 的布局加载进来,创建了一个 ViewHolder 实例。
  2. onBindViewHolder - 对 RecyclerView 的子项数据进行赋值,这个方法会在每个子项被滚动到屏幕内时进行。
  3. getItemCount - 返回 RecyclerView 的子项总数。

最后,我们在活动类中使用 RecyclerView :

public class MainActivity extends AppCompatActivity {
  private List cats = new ArrayList<>();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();
    RecyclerView recyclerView=(RecyclerView)findViewById(R.id.recycler_view);
    LinearLayoutManager layoutManager=new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    CatAdapter adapter=new CatAdapter(cats);
    recyclerView.setAdapter(adapter);
  }

  /**
   * 初始化数据
   */
  private void init() {
    cats.add(new Cat("暹罗猫", R.drawable.cat1));
    cats.add(new Cat("布偶猫", R.drawable.cat2));
    cats.add(new Cat("苏格兰折耳猫", R.drawable.cat3));
    cats.add(new Cat("英国短毛猫", R.drawable.cat4));
    cats.add(new Cat("波斯猫", R.drawable.cat5));
    cats.add(new Cat("俄罗斯蓝猫", R.drawable.cat6));
    cats.add(new Cat("美国短毛猫", R.drawable.cat7));
    cats.add(new Cat("异国短毛猫", R.drawable.cat8));
    cats.add(new Cat("挪威森林猫", R.drawable.cat9));
    cats.add(new Cat("孟买猫", R.drawable.cat10));
    cats.add(new Cat("缅因猫", R.drawable.cat11));
    cats.add(new Cat("埃及猫", R.drawable.cat12));
  }
}

这里创建了 LinearLayoutManager 的线性布局对象,传递给了 recyclerView.setLayoutManager() 方法。

recyclerView 示例

我们使用了 recyclerView 创建出了 ListView 的效果,而且代码逻辑更清晰咯。

2 横向滚动

现在让我们把这些猫变为 “横向滚动” 吧。

把 cat_item 中的元素变为垂直排列:

<&#63;xml version="1.0" encoding="utf-8"&#63;>


  

  

这里还把 LinearLayout 的宽度设为 110dp,即固定的值。因为每种猫的文字长度不同,如果用 wrap_content 的话,可能造成子项的长短不一致;而如果用 match_parent 的话,又会导致一个子项就占满了整个屏幕。

我们把 ImageView 与 TextView 都设置为水平居中,而且用 android:layout_marginTop,让文字与图片保持了一段距离,这样更美观。

接下来,修改活动类的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
  ...
  layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
  ...
}

把 LinearLayoutManager 的布局改为横向排列(默认是纵向排列)。

横向排列

我们可以在水平方向上滑动来查看屏幕外的 “猫” 啦。

ListView 的布局排列是由自身来管理的,所以存在一定的局限性;而 RecyclerView 把布局的工作交给了 LayoutManager,LayoutManager 制定了一系列可扩展的布局排列接口,所以我们只要按照接口的规范来实现,就能够定制出各种不同排列方式的布局啦O(∩_∩)O~

3 瀑布流布局

让我们使用 StaggeredGridLayoutManager 来实现酷炫的瀑布流布局吧O(∩_∩)O~

首先修改 cat_item 布局文件:



  

  

这里把 LinearLayout 的宽度改为 wrap_content,这样宽度会根据实际的布局列数自动适配。 还使用 layout_margin 让子项之间留出一定的间距。最后将 TextView 改为居左对齐,因为下面的说明文件内容可能会很长哟O(∩_∩)O~

修改活动类的代码:

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

  init();

  RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

  StaggeredGridLayoutManager layoutManager=new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);

  recyclerView.setLayoutManager(layoutManager);
  CatAdapter adapter = new CatAdapter(cats);
  recyclerView.setAdapter(adapter);
}

在此,我们创建了 StaggeredGridLayoutManager 的实例,它的构造函数接受两个参数,第一个参数用于指定布局的列数,第二个参数用于指定布局的排列方向。

瀑布流示例

4 点击事件

RecyclerView 没有像 ListView 一样的 setOnItemClickListener() 事件,所以需要我们自己给子项具体的 View 注册点击事件。

ListView 的 setOnItemClickListener() 注册的是子项的点击事件,但如果想要注册点击的是子项里具体的某个按钮时,使用 ListView 实现起来就比较麻烦。所以 RecyclerView 直接摈弃了子项点击事件的监听器,把所有的点击事件都交给具体的 View 去注册实现咯O(∩_∩)O

修改适配器:

static class ViewHolder extends RecyclerView.ViewHolder {
  View catView;
  ImageView image;
  TextView name;

  public ViewHolder(View view) {
    super(view);
    catView = view;
    image = (ImageView) view.findViewById(R.id.image);
    name = (TextView) view.findViewById(R.id.name);
    Log.d(TAG, "ViewHolder: image:" + image);
    Log.d(TAG, "ViewHolder: name:" + name);
  }
}

public CatAdapter(List cats) {
  this.cats = cats;
}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cat_item, parent, false);

  final ViewHolder holder = new ViewHolder(view);
  holder.catView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      int position = holder.getAdapterPosition();
      Cat cat = cats.get(position);
      Toast.makeText(v.getContext(), "你点击了 View " + cat.getName(), Toast.LENGTH_SHORT).show();
    }
  });

  holder.image.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      int position = holder.getAdapterPosition();
      Log.d(TAG, "onClick: position:" + position);
      Cat cat = cats.get(position);
      Toast.makeText(v.getContext(), "你点击了图片 " + cat.getName(), Toast.LENGTH_SHORT).show();
    }
  });
  return holder;
}

我们为最外层的布局与 ImageView 都注册了点击事件,这就是 RecyclerView 的灵活之处。

触发 RecyclerView 点击事件

如果点击了图片下方的文字,会触发 ImageView 的点击事件,因为事件会向外传播哦O(∩_∩)O~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • HTML基础入门指南
    本文将深入浅出地介绍HTML的基础知识,包括其定义、开发工具、制定机构、特性、基本标签及更多实用内容。 ... [详细]
  • 深入解析AUTOSAR方法论:汽车电子系统开发的理论基础(第三部分)
    本文详细探讨了AUTOSAR方法论在汽车电子软件系统开发中的应用,涵盖了从系统配置到生成可执行代码的各个关键步骤。通过介绍各阶段的任务和工具支持,帮助读者全面理解AUTOSAR的设计流程。 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
  • ArcXML:互联网空间数据交换的专用语言
    ArcXML是一种专为ArcIMS平台设计的数据交换协议,基于XML标准,用于在不同组件之间传输和描述地理空间数据。本文将详细介绍ArcXML的背景、用途及其与XML的关系。 ... [详细]
  • 本文详细介绍如何使用 Python 集成微信支付的三种主要方式:Native 支付、APP 支付和 JSAPI 支付。每种方式适用于不同的应用场景,如 PC 网站、移动端应用和公众号内支付等。 ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • 优化Jenkins首次启动速度
    本文详细描述了在启动Jenkins后遇到的长时间加载问题,并提供了一种通过修改更新中心配置文件来显著提升启动速度的有效解决方案。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
author-avatar
燕子yanzi068_476
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有