• Android in Mono开发初体验之ListAdapter


      本文给大家介绍在MonoDevelop环境下实现Android中的ListAdapter显示数据功能。

     

      前一段时间在网上看到可以使用C#开发Android的新闻,感觉非常不错。毕竟我也写过.NET程序,所以就特别好奇,特别想想看看如何使用C#来开发Android程序。然后就来到了Mono的官方网站下载安装程序并配置开发环境,至于如何配置其开发环境这里不再说述,有兴趣或需要的朋友直接登录Mono的官方网站查看:http://xamarin.com/

      目前MonoDevelop有收费和免费的版本,免费的只能在模拟器上运行,不能安装到真机中测试,不过这不影响我们研究MonoDevelop来开发Android程序。这个大家了解下就可以了。

      今天这个示例是使用ListAdapter来显示数据,我让ListAdapter直接继承自BaseAdapter。关于Adapter的详细信息在这里我不再详述,有兴趣的朋友直接上网搜索一下相关资料。接下来让我们先看一下今天这个示例的运行效果,如下图所示:

        

      下面呢,让我们在MonoDevelop中新建程序,选择Mono for Android Application模板,下面是程序结构图:

       

      我们需要在程序中新建一个类,命名为Application.cs,其代码如下:

    using System;
    
    namespace MyListAdapter
    {
        /// <summary>
        /// Application.
        /// 应用程序实体类
        /// </summary>
        public class Application
        {
            public Application ()
            {
            }
    
            public string Name {
                get;
                set;
            }
    
            public string Description {
                get;
                set;
            }
    
            public int Image {
                get;
                set;
            }
        }
    }

      接下来,我们需要在ListView中展示信息,那么就需要为ListView设置每行的Item样式。在MonoDevelop下设计布局界面和在Eclipse中差不多,代码也几乎一样。如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="80px">
        <ImageView
            android:id="@+id/imageView_item"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical" />
        <LinearLayout
            android:id="@+id/linearlayout_text"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:orientation="vertical"
            android:layout_marginLeft="10px"
            android:layout_marginTop="10px">
            <TextView
                android:id="@+id/textview_top"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TextView" />
            <TextView
                android:id="@+id/textview_bottom"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TextView" />
        </LinearLayout>
    </LinearLayout>

      不过,需要注意的是在引用布局中的View时,是使用类似于Resource.Id.imageView_item这样的方式。在ListAdapter类中,我让ListAdapter继承BaseAdapter,由于BaseAdapter是一个抽象类,这就要求我们实现其相应的属性和方法。看下面代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using Android.App;
    using Android.Content;
    using Android.OS;
    using Android.Runtime;
    using Android.Views;
    using Android.Widget;
    
    namespace MyListAdapter
    {
        /// <summary>
        /// List adapter.
        /// ListView数据适配器
        /// </summary>
        public class ListAdapter : BaseAdapter<Application>
        {
            private Activity context = null;
            public List<Application> list = null;
    
            /// <summary>
            /// 默认构造器
            /// </summary>
            public ListAdapter ()
            {
            }
    
            /// <summary>
            /// 带参构造器
            /// </summary>
            /// <param name="context"></param>
            /// <param name="list"></param>
            public ListAdapter (Activity context, List<Application> list): base()
            {
                this.context = context;
                this.list = list;
            }
    
            public override int Count {
                get { return this.list.Count; }
            }
    
            public override Application this [int position] {
                get { return this.list[position]; }
            }
    
            public override View GetView (int position, View convertView, ViewGroup parent)
            {
                var item = this.list[position];
                var view = convertView;
    
                if (convertView == null || !(convertView is LinearLayout))
                {
                    view = context.LayoutInflater.Inflate(Resource.Layout.Main, parent, false);
                }
    
                var imageItem = view.FindViewById (Resource.Id.imageView_item) as ImageView;
                var tvName = view.FindViewById (Resource.Id.textview_top) as TextView;
                var tvDescrtion = view.FindViewById (Resource.Id.textview_bottom) as TextView;
    
                imageItem.SetImageResource (item.Image);
                tvName.SetText (item.Name, TextView.BufferType.Normal);
                tvDescrtion.SetText (item.Description, TextView.BufferType.Normal);
    
                view.Click += delegate(object sender, EventArgs e)
                {
                    Toast.MakeText(context,((TextView)tvName).Text,ToastLength.Long).Show();
                };
    
                return view;
            }
    
            public override long GetItemId (int position)
            {
                return position;
            }
        }
    }

      一般呢,我们会将ListAdapter作为ListView的数据桥梁,用ListView来展现数据。当然了,我们也可以不用ListView来达到展现数据的目的。打开MainActivity文件,将类继承的Activity修改成ListActivity,编写相应的代码:

    using System;
    
    using Android.App;
    using Android.Content;
    using Android.Runtime;
    using Android.Views;
    using Android.Widget;
    using Android.OS;
    using System.Collections.Generic;
    
    namespace MyListAdapter
    {
        [Activity (Label = "MyListAdapter", MainLauncher = true)]
        public class MainActivity : ListActivity
        {
            protected override void OnCreate(Bundle bundle)
            {
                base.OnCreate(bundle);
    
                // 初始化列表数据
                InitListData();
            }
    
            /// <summary>
            /// 初始化列表数据
            /// </summary>
            public void InitListData()
            {
                this.ListAdapter = new ListAdapter(this,
                new List<Application>() {
                    new Application() { Name = "angrybirds",Description = "angrybirds",Image = Resource.Drawable.angrybirds },
                    new Application() { Name = "camera",Description = "camera",Image = Resource.Drawable.camera },
                    new Application() { Name = "evernotealt",Description = "evernotealt",Image = Resource.Drawable.evernotealt },
                    new Application() { Name = "fruitninja Mouse",Description = "fruitninja",Image = Resource.Drawable.fruitninja },
                    new Application() { Name = "gtalk",Description = "gtalk",Image = Resource.Drawable.gtalk },
                    new Application() { Name = "handcent",Description = "handcent",Image = Resource.Drawable.handcent },
                    new Application() { Name = "maps",Description = "maps",Image = Resource.Drawable.maps },
                    new Application() { Name = "tasks",Description = "tasks",Image = Resource.Drawable.tasks },
                    new Application() { Name = "twitterblue",Description = "twitterblue",Image = Resource.Drawable.twitterblue },
                    new Application() { Name = "widgetlocker",Description = "widgetlocker",Image = Resource.Drawable.widgetlocker },
                    new Application() { Name = "youtube",Description = "youtube",Image = Resource.Drawable.youtube }, 
                    new Application() { Name = "settingsa",Description = "settingsa",Image = Resource.Drawable.settingsa },
                    new Application() { Name = "cam360",Description = "cam360",Image = Resource.Drawable.cam360 },
                    new Application() { Name = "downloads",Description = "downloads",Image = Resource.Drawable.downloads },
                    new Application() { Name = "dropbox",Description = "dropbox",Image = Resource.Drawable.dropbox },
                    new Application() { Name = "evernote",Description = "evernote",Image = Resource.Drawable.evernote },
                    new Application() { Name = "recorder",Description = "recorder",Image = Resource.Drawable.recorder }
                }
                );
            }
        }
    }

      这样,相应的代码都已经编写完毕,在MonoDevelop中只需要按F5键运行就可以了,如果模拟器没启动,需要我们先动一个模拟器。另外,我们需要注意的是,如果大家是在VS2010中运行程序,需要点击"生成-->配置管理器",选择"布署",再点击运行就可以了。如下图:

       

      其实呢,使用MonoDevelop开发Android程序,只要我们有Android的开发经验,很快就能上手。即使是新手,有点C#基础上手起来也不是难事。以上就是在Mono中开发Android的ListAdapter并生成相应列表的过程。

      注意在运行示例时,一定要将Mono环境配置好。关于环境的配置不再详述。

      示例下载:/Files/hanyonglu/AndroidFile/MyListAdapter.rar

     
      Github地址:https://github.com/hanyonglu/MonoListAdapter

      最后,希望转载的朋友能够尊重作者的劳动成果,加上转载地址:http://www.cnblogs.com/hanyonglu/archive/2012/08/14/2638428.html 谢谢。

      完毕。^_^

  • 相关阅读:
    通过smtp直接发送邮件
    C# 带参访问接口,WebClient方式
    ASP.NET MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction
    asp.net mvc Html.BeginForm()及Html.Action用法
    Knut重排算法
    C# copy() 与 Clone()区别
    oracle针对某列让特定信息排序[decode]
    oracle 创建表空间详细介绍
    【笔记】.NET开发环境下使用PostgreSQL+Oracle_fdw 实现两个数据库之间数据交互操作(二)
    【笔记】.NET开发环境下使用PostgreSQL+Oracle_fdw 实现两个数据库之间数据交互操作(一)
  • 原文地址:https://www.cnblogs.com/hanyonglu/p/2638428.html
Copyright © 2020-2023  润新知