Xamarin.Android GridView

GridView 是一个 ViewGroup,它在二维可滚动网格中显示项。 使用 ListAdapter 将网格项自动插入到布局中。

在本教程中,你将创建图像缩略图网格。 选择项后,toast 消息将显示图像的位置。

启动一个名为 HelloGridView 的新项目。

找到一些想要使用的照片,或下载这些示例图像。 将图像文件添加到项目的 Resources/Drawable 目录。 在“属性”窗口中,将每个文件的“生成操作”设置为“AndroidResource”

打开 Resources/Layout/Main.axml 文件并插入以下内容:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gridview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:columnWidth="90dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
/>

GridView 将填充整个屏幕。 这些属性的含义不言自明。 有关有效属性的详细信息,请参阅 GridView 参考。

打开 HelloGridView.cs 并为 OnCreate() 方法插入以下代码:

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);

    SetContentView (Resource.Layout.Main);

    var gridview = FindViewById<GridView> (Resource.Id.gridview);
    gridview.Adapter = new ImageAdapter (this);

    gridview.ItemClick += delegate (object sender, AdapterView.ItemClickEventArgs args) {
        Toast.MakeText (this, args.Position.ToString (), ToastLength.Short).Show ();
    };
}

为内容视图设置 Main.axml 布局后,使用 FindViewById 从布局中捕获 GridView。 此 然后,使用 Adapter 属性将自定义适配器 (ImageAdapter) 设置为要在网格中显示的所有项的源。 将在下一步骤中创建 ImageAdapter

要在单击网格中的项时执行某些操作,需要匿名委托订阅 ItemClick 事件。 它显示 Toast,其中显示选定项的索引位置(从零开始)(在实际方案中,该位置可用于获取其他任务的全尺寸图像)。 请注意,可以使用 Java 样式侦听器类,而不是 .NET 事件。

创建一个名为 ImageAdapter 的新类,该类对 BaseAdapter 进行子类化:

public class ImageAdapter : BaseAdapter
{
    Context context;

    public ImageAdapter (Context c)
    {
        context = c;
    }

    public override int Count {
        get { return thumbIds.Length; }
    }

    public override Java.Lang.Object GetItem (int position)
    {
        return null;
    }

    public override long GetItemId (int position)
    {
        return 0;
    }

    // create a new ImageView for each item referenced by the Adapter
    public override View GetView (int position, View convertView, ViewGroup parent)
    {
        ImageView imageView;

        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView (context);
            imageView.LayoutParameters = new GridView.LayoutParams (85, 85);
            imageView.SetScaleType (ImageView.ScaleType.CenterCrop);
            imageView.SetPadding (8, 8, 8, 8);
        } else {
            imageView = (ImageView)convertView;
        }

        imageView.SetImageResource (thumbIds[position]);
        return imageView;
    }

    // references to our images
    int[] thumbIds = {
        Resource.Drawable.sample_2, Resource.Drawable.sample_3,
        Resource.Drawable.sample_4, Resource.Drawable.sample_5,
        Resource.Drawable.sample_6, Resource.Drawable.sample_7,
        Resource.Drawable.sample_0, Resource.Drawable.sample_1,
        Resource.Drawable.sample_2, Resource.Drawable.sample_3,
        Resource.Drawable.sample_4, Resource.Drawable.sample_5,
        Resource.Drawable.sample_6, Resource.Drawable.sample_7,
        Resource.Drawable.sample_0, Resource.Drawable.sample_1,
        Resource.Drawable.sample_2, Resource.Drawable.sample_3,
        Resource.Drawable.sample_4, Resource.Drawable.sample_5,
        Resource.Drawable.sample_6, Resource.Drawable.sample_7
    };
}

首先,这会实现一些从 BaseAdapter 继承的必需方法。 构造函数和 Count 属性的含义不言自明。 通常,GetItem(int) 应返回适配器中指定位置处的实际对象,但本示例中忽略了该对象。 同样,GetItemId(int) 应返回项的行 ID,但此处不是必需的。

第一种必需的方法是 GetView()。 此方法为 添加到 ImageAdapter 的每个图像创建一个新 View。 调用它时,将传入 View,该对象通常是一个回收对象(至少在调用一次之后),因此需要检查该对象是否为 null。 如果为 null,ImageView 已实例化并配置有图像呈现所需的属性:

  • LayoutParams 设置视图的高度和宽度,这确保了无论可绘制对象的大小如何,每个图像都会根据需要调整大小并进行裁剪,以适合这些尺寸。

  • SetScaleType() 声明图像应向中心裁剪(如有必要)。

  • SetPadding(int, int, int, int) 定义所有边的填充。 (请注意,如果图像具有不同的长宽比,则如果图像与提供给 ImageView 的尺寸不匹配,则较少的填充将导致图像的更多裁剪。)

如果传递给 GetView()View 不是 null,则本地ImageView 使用回收的 View 对象初始化。

GetView() 方法的最后,传入该方法的 position 整数用于从 thumbIds 数组中选择一个图像,该图像被设置为 ImageView 的图像资源。

剩下的就是定义可绘制资源的 thumbIds 数组。

运行该应用程序。 网格布局应如下所示:

Example screenshot of GridView displaying 15 images

尝试通过调整 GridViewImageView 元素的属性来试验其行为。 例如,不要使用 LayoutParams,而是尝试使用 SetAdjustViewBounds()

参考

本页的部分内容是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据知识共享署名 2.5 通用许可协议中的条款进行使用。