Xamarin-Android_BaseAdapter 简单的复用
缘由:
本人是一枚 小菜 初学Xamarin-Android 正在学习ListView 控件 发现这个控件的自定义布局 用的那叫一个爽字了得。
但是每次用ListView的时候都要 继承一下BaseAdapter 这就不爽了。好气啊,我这个人非常的懒只好寻求改良之法。
写这篇博客在这里献丑甚是尴尬啊,还请园子里的诸位大咖多多指正。小弟不胜感激!【谢谢O(∩_∩)O哈!】
小弟学识浅薄仅仅做了以下的改良之处
- 抽取泛型 因为基本上的是大同小异的 只是 类型的不同 如这次是 Person 类型 下次可能就是 Student 类型的区别而已 所以就想到了泛型
- 将对 View 进行赋值的方法 使用委托进行替换。因为除了类型不同之外 也就这点不同了
下面是效果图 自己都感觉丑 丑哭了 (⊙o⊙)…
代码奉上
ListItem的布局代码
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="horizontal" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:minWidth="25px" 7 android:minHeight="25px"> 8 <ImageView 9 android:layout_width="89.5dp" 10 android:layout_height="67.5dp" 11 android:id="@+id/imgHard" /> 12 <LinearLayout 13 android:orientation="vertical" 14 android:minWidth="25px" 15 android:minHeight="25px" 16 android:layout_width="200dp" 17 android:layout_height="67.5dp" 18 android:id="@+id/linearLayout1"> 19 <TextView 20 android:text="Large Text" 21 android:textAppearance="?android:attr/textAppearanceLarge" 22 android:layout_width="279.5dp" 23 android:layout_height="wrap_content" 24 android:id="@+id/txtName" /> 25 <TextView 26 android:text="Small Text" 27 android:textAppearance="?android:attr/textAppearanceSmall" 28 android:layout_width="match_parent" 29 android:layout_height="wrap_content" 30 android:id="@+id/txtDesc" 31 android:textSize="12dp" /> 32 </LinearLayout> 33 <Button 34 android:text="查看信息" 35 android:layout_width="wrap_content" 36 android:layout_height="67.5dp" 37 android:id="@+id/button1" /> 38 </LinearLayout>
主界面的代码
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent"> 6 <ListView 7 android:minWidth="25px" 8 android:minHeight="25px" 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" 11 android:id="@+id/itemsPerson" 12 android:divider="@android:color/white" 13 android:dividerHeight="3dp" 14 android:descendantFocusability="afterDescendants" /> 15 </LinearLayout>
AllRoundBaseAdapter代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Android.App; 7 using Android.Content; 8 using Android.OS; 9 using Android.Runtime; 10 using Android.Views; 11 using Android.Widget; 12 13 namespace AdapterStudy_20170301 14 { 15 public class AllRoundAdapter<T> : BaseAdapter<T> 16 { 17 #region 全局变量 18 /// <summary> 19 /// 上下文 20 /// </summary> 21 public Activity MyContext { get; set; } 22 23 /// <summary> 24 /// 数据源 25 /// </summary> 26 public List<T> MyDataSource { get; set; } 27 28 /// <summary> 29 /// Item 布局资源 30 /// </summary> 31 public int LayoutSource { get; set; } 32 33 /// <summary> 34 /// 执行的委托 35 /// </summary> 36 Action<View, T> MyAction; 37 #endregion 38 39 /// <summary> 40 /// 建立 AllRoundBaseAdapter 41 /// </summary> 42 /// <param name="actity">上下文</param> 43 /// <param name="listDataSource">数据源</param> 44 /// <param name="layoutSource">布局ID</param> 45 /// <param name="action">为布局赋值用到的方法</param> 46 public AllRoundAdapter(Activity actity, List<T> listDataSource, int layoutSource, Action<View, T> action) 47 { 48 this.MyContext = actity; 49 this.MyDataSource = listDataSource; 50 51 this.LayoutSource = layoutSource; 52 53 this.MyAction = action; 54 } 55 56 public override T this[int position] 57 { 58 get 59 { 60 return MyDataSource[position]; 61 } 62 } 63 64 public override int Count 65 { 66 get 67 { 68 return this.MyDataSource.Count; 69 } 70 } 71 72 public override long GetItemId(int position) 73 { 74 return position; 75 } 76 77 public override View GetView(int position, View convertView, ViewGroup parent) 78 { 79 T t = this.MyDataSource[position]; 80 81 View v = convertView; 82 if (v == null) 83 { 84 v = this.MyContext.LayoutInflater.Inflate(this.LayoutSource, null); 85 } 86 87 if (this.MyAction != null) 88 { 89 this.MyAction.Invoke(v, t); 90 } 91 92 return v; 93 } 94 } 95 }
MainActivity的代码
1 using System; 2 using Android.App; 3 using Android.Content; 4 using Android.Runtime; 5 using Android.Views; 6 using Android.Widget; 7 using Android.OS; 8 using System.Collections.Generic; 9 using Javax.Crypto; 10 11 namespace AdapterStudy_20170301 12 { 13 [Activity(Label = "AdapterStudy_20170301", MainLauncher = true, Icon = "@drawable/icon")] 14 public class MainActivity : Activity 15 { 16 17 private ListView lvPerson; 18 private List<Person> listPerson = new List<Person>(); 19 20 protected override void OnCreate(Bundle bundle) 21 { 22 base.OnCreate(bundle); 23 24 // Set our view from the "main" layout resource 25 SetContentView(Resource.Layout.Main); 26 27 28 lvPerson = FindViewById<ListView>(Resource.Id.itemsPerson); 29 30 //填充一些数据 31 this.listPerson.Add(new Person("张飞", Resource.Drawable.person, "张翼德")); 32 this.listPerson.Add(new Person("刘备", Resource.Drawable.person, "刘玄德")); 33 this.listPerson.Add(new Person("关羽", Resource.Drawable.person, "关云长")); 34 this.listPerson.Add(new Person("张飞", Resource.Drawable.person, "张翼德")); 35 this.listPerson.Add(new Person("刘备", Resource.Drawable.person, "刘玄德")); 36 this.listPerson.Add(new Person("关羽", Resource.Drawable.person, "关云长")); 37 this.listPerson.Add(new Person("张飞", Resource.Drawable.person, "张翼德")); 38 this.listPerson.Add(new Person("刘备", Resource.Drawable.person, "刘玄德")); 39 this.listPerson.Add(new Person("张飞", Resource.Drawable.person, "张翼德")); 40 this.listPerson.Add(new Person("刘备", Resource.Drawable.person, "刘玄德")); 41 this.listPerson.Add(new Person("关羽", Resource.Drawable.person, "关云长")); 42 this.listPerson.Add(new Person("关羽", Resource.Drawable.person, "关云长")); 43 44 //设置表头表尾 45 View header = this.LayoutInflater.Inflate(Resource.Layout.HeaderLayout, null); 46 View footer = this.LayoutInflater.Inflate(Resource.Layout.FooterLayout, null); 47 48 this.lvPerson.AddHeaderView(header); 49 this.lvPerson.AddFooterView(footer); 50 51 //使用泛型的Adapter 进行赋值 52 lvPerson.Adapter = new AllRoundAdapter<Person>(this, listPerson, Resource.Layout.ListViewItemLayout, 53 (x, y) => 54 { 55 x.FindViewById<TextView>(Resource.Id.txtName).Text = y.Name; 56 x.FindViewById<TextView>(Resource.Id.txtDesc).Text = y.Desc; 57 x.FindViewById<ImageView>(Resource.Id.imgHard).SetBackgroundResource(y.Image); 58 }); 59 60 } 61 } 62 }
学识浅薄,请多多指正,多多关照! 感觉自己好菜 掩面而逃。