读书频道 > 软件开发 > C# > C#开发Android应用实战——使用Mono for Android和.NET/C#
6.3.8 在网格中显示数据
2012-12-26 11:20:13     我来说两句 
收藏    我要投稿   
《C#开发Android应用实战——使用Mono for Android和.NET/C# 全面透彻地讲解Android应用编程知识,分析如何结合使用C#和Mono来编写在Android设备系列上运行的应用程序。在这本由多位专家联袂撰写的必备精品书...  立即去当当网订购

如果想在应用程序中显示一个图片网格,那么应该怎么做呢?此时可以使用一个ListView,并将每一行划分为多个列,并由你自己管理每一个行,而实际上是管理三个单独的项。虽然实现上述功能具有一定挑战性,却可以通过创建ListView的一个子类来实现,在需要的任何时候重用该子类即可。

然而,Android为你提供了GridView来完成上述功能。从根本上讲,GridView派生自ListView,但GridView在一个二维的可滚动网格中按列以及按行来显示列表项,而不是像ListView那样每一行只显示一个列表项。可以对列的数量以及每列的宽度进行设置,以便显示不同数量的数据。

因为没有诸如ListActivity之类的简单活动适用于GridView,所以至少必须创建一个带有一个GridView的基本XML布局文件。程序清单6-29显示了带有一个GridView的基本布局。此时除了要了解你所熟悉的ListView特性外,还需要了解特定于GridView的两个特性:

numColumns:该特性既可以被设置为一个明确的数字,也可以设置为auto_fit,如果设置为后者,GridView将自动在一行中显示可以容纳下的多个列。对于横向模式来说该特性非常有用,在多数设备上,横向模式通常可以比纵向模式容纳更多的列。

stretchMode:该特性确定了如何处理一行中没有被合适的列所占用的多余空间。如果该值被设置为columnWidth,那么任何多余空间将会在行中每个列的宽度之间平均分配。但如果该值被设置为spacingWidth,多余空间将在行中列之间的白色空间之间平均分配。

程序清单6-29  GridView布局
<?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"
/>
Lists07\Resources\layout\Gridview.axml

就像每个ListView一样,GridView也需要ListAdapter。该适配器可以是ArrayAdapter、SimpleAdapter或者派生自BaseAdapter的自定义适配器,就像前面创建的项目那样。继续上面的示例,接下来将创建一个名为ImageAdapter的新自定义适配器,该适配器为每一项显示一张图像。这可能是GridView最常见的用法之一,当然也不只限于图像。可使用程序清单6-30创建自己的ImageAdapter。

程序清单6-30  ImageAdapter
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.Graphics.Drawables;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace Lists07
{
   public class ImageAdapter : BaseAdapter<Drawable>
   {
       Context context;

       public ImageAdapter(Context context)
       {
           this.context = context;
           this.Images = new List<Drawable>();
       }

       public List<Drawable> Images
       {
           get;
           set;
       }

       public override int Count
       {
           get { return this.Images.Count; }
       }

       public override Drawable this[int position]
       {
           get { return this.Images[position]; }
       }

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


       public override View GetView(int position,View convertView,ViewGroup
           parent)
       {
           ImageView imageView;

           if (convertView == null)
               imageView = new ImageView(context);
           else
               imageView = (ImageView)convertView;

           imageView.SetImageDrawable(this.Images[position]);

           return imageView;
       }
   }
}
Lists07\ImageAdapter.cs

请注意,ImageAdapter使用了BaseAdapter<Drawable>泛型类型,其中Drawable表示为每项显示的图像。同时,ImageAdapter有一个List<Drawable>属性,用来存储在GridView中显示的每个图像的实例。该构造函数要求传入一个Context,以便当创建在每个列表项中显示的ImageViews时可以使用该Context。

现在关注一下GetView,首先对convertView进行检查,以便确定ImageView是否可回收利用。如果不能回收,就创建一个新ImageView。在任何一种情况下,都需要将imageView引用分配给指定位置的Drawable。

还需要一个显示GridView的Activity。程序清单6-31显示了一个使用来自于程序清单6-29的XML布局的Activity。

程序清单6-31  GridView Activity代码
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Graphics.Drawables;
namespace Lists07
{
   [Activity(Label = "GridView", MainLauncher = true)]
   public class ImageGridViewActivity : Activity
   {
       protected override void OnCreate(Bundle bundle)
       {
           base.OnCreate(bundle);

           // Set our view from the "main" layout resource
           SetContentView(Resource.Layout.Gridview);

           // Get our button from the layout resource,
           // and attach an event to it
           var gridView=this.FindViewById<GridView>(Resource.Id.Gridview);

          var ia = new ImageAdapter(this);
         ia.Images.Add(Resources.GetDrawable(Resource.Drawable.Battery));
          ia.Images.Add(Resources.GetDrawable(Resource.Drawable.Computer));
          ia.Images.Add(Resources.GetDrawable(Resource.Drawable.DriveCDROM));
           ia.Images.Add(Resources.GetDrawable(Resource.Drawable.DriveHardDisk));
           ia.Images.Add(Resources.GetDrawable(Resource.Drawable.InputKeyboard));
           ia.Images.Add(Resources.GetDrawable(Resource.Drawable.InputMouse));
           ia.Images.Add(Resources.GetDrawable(Resource.Drawable.MediaCDROM));
         ia.Images.Add(Resources.GetDrawable(Resource.Drawable
             .MediaCDROMAudio));
         ia.Images.Add(Resources.GetDrawable(Resource.Drawable.MediaCDRW));
         ia.Images.Add(Resources.GetDrawable(Resource.Drawable.MediaDVD));
         ia.Images.Add(Resources.GetDrawable(Resource.Drawable.MediaDVDRW));
         ia.Images.Add(Resources.GetDrawable(Resource.Drawable.MediaFloppy));
         ia.Images.Add(Resources.GetDrawable(Resource.Drawable.Printer));
         ia.Images.Add(Resources.GetDrawable(Resource.Drawable.VideoDisplay));

           gridView.Adapter = ia;
       }
   }
}
Lists07\ImageGridViewActivity.cs

项目中使用的所有图像必须存在于适当的Resources文件夹结构中,并将Build Action属性设置为AndroidResource。图6-15显示了针对图像的Visual Studio解决方案资源管理器布局。


 

当编译并运行项目时,将看到一个类似于图6-16的GridView。请注意横向和纵向模式是如何容纳不同数量的列。因为无法在XML布局资源文件中指定列数,GridView根据列宽自动显示尽可能多的列。


 

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:6.3.7 分组列表
下一篇:6.4 小结
相关文章
图文推荐
2.2.3 对程序进行调
2.2.2 编译和运行程
2.2.1 创建控制台项
2.1 开发环境的搭建
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站