分类:C#、Android、VS2015;

创建日期:2016-02-19

一、简介

滚动视图(RecyclerView)的用法与布局控件的用法类似,唯一不同的是,所有布局控件中都可以包含多个组件,而滚动视图里只能包含一个组件。换言之,滚动视图就是一个专门的容器,这个容器里面可以包含一个大于屏幕宽度(或高度)的组件,你可以采用拖拽的方式来观察它包含的内容。

不过,话又说回来,如果滚动视图包含的这个组件是一个布局容器,容器内仍然可以包含多个组件。

1、需要安装Xamarin.Android.Support.v7.RecyclerView软件包

RecyclerView是由Android Support v7支持库提供的,用C#编写Android应用程序时,要使用RecyclerView,项目中必须包括Xamarin.Android.Support.v7.RecyclerView软件包。

软件包的具体添加办法见10.2节的介绍。

2、RecyclerView和ListView的对比

可将RecyclerView看作是替换ListView和GridView的新控件,RecyclerView的作用也是为了在小窗口内显示较大的数据集,但RecyclerView提供了更多的版式选项,以及对于大型集合的更好的优化处理。

ListView和RecyclerView的重要差异如下:

  • 由于RecyclerView内置了动画处理,因此其用法比ListView复杂,需要编写的代码也较多。
  • RecyclerView不提供预定义的适配器,必须自己去实现访问数据源的适配器代码。而ListView和GridView都包含了预定义的适配器。
  • RecyclerView不提供项的单击事件,而是由助手类处理包含项的单击事件。而ListView则提供了项的click事件。
  • RecyclerView通过滚动项增强了性能,它通过持续视图模式消除了不必要的布局资源查找。而在ListView中该模式是可选项。
  • RecyclerView是基于模块化的设计思想来实现的,这使它更容易被定制。例如,无需对布局进行大量的代码更改就可以将其插入到应用程序中。而ListView的结构相对来说比较单一。

二、示例—ch1003RecyclerViewDemo

本节示例使用RecyclerView显示大量照片(32张),目的是为了测试其滚动性能,每个照片都用卡片视图来构造。

注意:本示例需要安装Xamarin.Android.Support.v7.RecyclerView软件包。具体安装办法见10.2节的介绍。

1、运行效果

2、设计步骤

(1)添加ch1003_PhotoCardView.axml文件

在layout文件夹下添加该文件。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardElevation="4dp"
card_view:cardUseCompatPadding="true"
card_view:cardCornerRadius="7dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:scaleType="centerCrop" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#333333"
android:text="Caption"
android:id="@+id/textView"
android:gravity="center_horizontal" />
</LinearLayout>
</android.support.v7.widget.CardView>
</FrameLayout>

(2)添加ch1003_RecyclerViewDemo.axml文件

在layout文件夹下添加该文件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/btnRandPick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="随机挑选一张照片和首张交换"
android:layout_gravity="center_horizontal" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:scrollbars="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>

(3)添加ch1003RecyclerViewDemo.cs文件

在SrcDemos文件夹下添加该文件。

using System;
using Android.App;
using Android.OS;
using Android.Views;
using Android.Widget;
using Android.Support.V7.Widget; namespace MyDemos.SrcDemos
{
[Activity(Label = "【例10-3】滚动视图基本用法")]
public class ch1003RecyclerViewDemo : Activity
{
RecyclerView.LayoutManager m;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
var mPhotoAlbum = new PhotoAlbum();
SetContentView(Resource.Layout.ch1003_RecyclerViewDemo);
var mRecyclerView = FindViewById<RecyclerView>(Resource.Id.recyclerView); // 必须为滚动视图创建一个布局管理器,它默认不创建
//方式1:纵向滚动
m = new LinearLayoutManager(this);
//方式2:横向滚动,每屏2张图(2行)
// m = new GridLayoutManager(this, 2, GridLayoutManager.Horizontal, false); mRecyclerView.SetLayoutManager(m);
// 必须为RecyclerView创建一个适配器,没有适配器它什么都干不了
var mAdapter = new PhotoAlbumAdapter(mPhotoAlbum);
mAdapter.ItemClick += (object sender, int position) =>
{
int n = position + 1;
Toast.MakeText(this, "这是第" + n + "张照片", ToastLength.Short).Show();
};
mRecyclerView.SetAdapter(mAdapter);
Button randomPickBtn = FindViewById<Button>(Resource.Id.btnRandPick);
randomPickBtn.Click += delegate
{
if (mPhotoAlbum != null)
{
int idx = mPhotoAlbum.RandomSwapTop();
mAdapter.NotifyItemChanged(0);
mAdapter.NotifyItemChanged(idx);
}
};
}
} public class Photo
{
public int PhotoID { get; set; }
public string Caption { get; set; }
} public class PhotoAlbum
{
private static int[] a =
{
Resource.Drawable.ch05sample_0,
Resource.Drawable.ch05sample_1,
Resource.Drawable.ch05sample_2,
Resource.Drawable.ch05sample_3,
Resource.Drawable.ch05sample_4,
Resource.Drawable.ch05sample_5,
Resource.Drawable.ch05sample_6,
Resource.Drawable.ch05sample_7
};
private static Photo[] photos;
private Random r = new Random();
public PhotoAlbum()
{
//模拟填充大量图片(此处填了32个)来观察滚动视图的性能
photos = new Photo[32];
for (int i = 0; i < photos.Length; i++)
{
int n = i % a.Length;
photos[i] = new Photo { PhotoID = a[n], Caption = "小狗" + (i + 1) };
}
} public int NumPhotos
{
get { return photos.Length; }
} public Photo this[int i]
{
get { return photos[i]; }
} // 随机挑选一张照片与最顶部的那张照片交换
public int RandomSwapTop()
{
Photo tmpPhoto = photos[0];
int rnd = r.Next(1, photos.Length);
photos[0] = photos[rnd];
photos[rnd] = tmpPhoto;
return rnd;
}
} public class PhotoViewHolder : RecyclerView.ViewHolder
{
public ImageView image { get; private set; }
public TextView caption { get; private set; }
public PhotoViewHolder(View itemView, Action<int> listener)
: base(itemView)
{
image = itemView.FindViewById<ImageView>(Resource.Id.imageView);
caption = itemView.FindViewById<TextView>(Resource.Id.textView);
itemView.Click += (sender, e) => listener(base.AdapterPosition);
}
} public class PhotoAlbumAdapter : RecyclerView.Adapter
{
public event EventHandler<int> ItemClick;
public PhotoAlbum myPhotoAlbum { get; set; } public override int ItemCount
{
get { return myPhotoAlbum.NumPhotos; }
} public PhotoAlbumAdapter(PhotoAlbum photoAlbum)
{
myPhotoAlbum = photoAlbum;
} public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
PhotoViewHolder vh = holder as PhotoViewHolder;
vh.image.SetImageResource(myPhotoAlbum[position].PhotoID);
vh.caption.Text = myPhotoAlbum[position].Caption;
} public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
View itemView = LayoutInflater.From(parent.Context)
.Inflate(Resource.Layout.ch1003_PhotoCardView, parent, false);
PhotoViewHolder vh = new PhotoViewHolder(itemView, OnClick);
return vh;
} void OnClick(int position)
{
if (ItemClick != null) ItemClick(this, position);
}
}
}

【Android】10.5 滚动视图(RecyclerView)的更多相关文章

  1. Android 自学之滚动视图ScrollView

    滚动视图ScrollView由FarmeLayout派生而出,他就是一个用于为普通组件添加垂直滚动条的组件:ScrollView里面最多包含一个组件,而ScrollView的作用就是为该组件添加一个垂 ...

  2. 从零開始学android&lt;ScrollView滚动视图.十八.&gt;

    因为手机屏幕的高度有限.所以假设面对组件要显示多组信息的时候,ScrollView视图(滚动视图)能够有效的安排这些组件,浏览时能够自己主动的进行滚屏的操作. android.widget.Scrol ...

  3. Xamarin iOS教程之进度条和滚动视图

    Xamarin iOS教程之进度条和滚动视图 Xamarin iOS 进度条 进度条可以看到每一项任务现在的状态.例如在下载的应用程序中有进度条,用户可以很方便的看到当前程序下载了多少,还剩下多少.Q ...

  4. Android零基础入门第61节:滚动视图ScrollView

    原文:Android零基础入门第61节:滚动视图ScrollView 前面几期学习了ProgressBar系列组件.ViewAnimator系列组件.Picker系列组件和时间日期系列组件,接下来几期 ...

  5. Android应用--新浪微博客户端新特性滚动视图和启动界面实现

    新浪微博客户端新特性滚动视图和启动界面实现 2013年8月20日新浪微博客户端开发之启动界面实现 前言: 使用过新浪微博客户端的童鞋都清楚,客户端每一次升级之后第一次启动界面就会有新特性的介绍,用户通 ...

  6. Android——滚动视图(ScrollView)图片视图(ImageView)、状态开关按钮(ToggleButton)、时钟

    xml <?xml version="1.0" encoding="utf-8"?> <!--滚动视图--> <ScrollVie ...

  7. Android中通过Java代码实现ScrollView滚动视图-以歌词滚动为例

    场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...

  8. 滚动视图、列表视图[ListView、SimpleAdapter类]

    滚动视图 <ScrollView android: layout_width="fill_parent" android: layout_height="fill_ ...

  9. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

随机推荐

  1. Windows改桌面文件路径

    默认的桌面和用户文件都是C盘,每次重装系统要备份,为了方便可以把它设置到其他盘符,一种方式是通过一些软件功能,如360有一个C盘搬家,也可以修改注册表文件: Windows Registry Edit ...

  2. 自定义self.editButtonItem 改变自定义self.editButtonItem的背景图片

    一: // UIButton *editSome; 为全局变量,已开启ARC; editSome = [UIButton buttonWithType:UIButtonTypeCustom]; edi ...

  3. php之快速入门学习-13(PHP 循环 - While 循环)

    PHP 循环 - While 循环 循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块. PHP 循环 在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行.我们可以在代码中使用循 ...

  4. Java从零开始学二十二(集合Set接口)

    一.Set接口的定义 Set接口也是Collection接口的子接口,但是与Collection或List接口不同的是,Set接口中不能加入重复的元素 Set接口的主要方法与Collection是一致 ...

  5. MySQL单列索引和组合索引(联合索引)的区别详解

    发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引[推荐阅读:对mysql使用索引的误解] MySQL单列索引和组合索引(联合索引)的区 ...

  6. EasyMock的使用

    1.Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开.同时也可以当调用别人的模块,而该模块又没有实现时(只提供 ...

  7. 除掉inline-block 间距

    1.现象: <!doctype html> <html lang="en"> <head> <meta charset="UTF ...

  8. 简单说说Ubuntu利用bzr源码安装OpenERP7.0的操作步骤

    1.修改Ubuntu国内更新源,具体方法自己baidu.google. 修改更新源后,更新系统 sudo apt-get update sudo apt-get upgrade 复制代码 2.安装Po ...

  9. R语言中数据结构

    R语言还是有点古老感觉,数据结构没有Python中那么好用.以下简单总结一下R语言中经常使用的几个数据结构. 向量: R中的向量能够理解为一维的数组,每一个元素的mode必须同样,能够用c(x:y)进 ...

  10. AIX常用命令汇总(转)

    在本文中,我将讨论这其中的一些核心命令.其目的旨在为您提供一个可用作便捷参考的列表.虽然这些命令的行为在所有 AIX 版本中都应该相同,但是仅在 AIX 5.3 下对它们进行了测试. 注意:以下段落中 ...