且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

详解Dialog(二)——有关列表的构建

更新时间:2022-06-15 14:24:14

一、普通列表

普通列表的样式是这样的:

详解Dialog(二)——有关列表的构建

要实现这样的列表样式,是通过下面的方法来实现的:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. builder.setItems(CharSequence[] items, DialogInterface.OnClickListener listener)  
  2. builder.setItems(int itemsId, DialogInterface.OnClickListener listener)  
这两种方法实现的效果都是一样的,
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. setItems(CharSequence[] items, DialogInterface.OnClickListener listener)  
这个items传进去的是一个字符串数组;
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. setItems(int itemsId, DialogInterface.OnClickListener listener)  
这个传进去的一个itemsId,是在XML中定义好的一个字符串数组资源的ID;

下面,我们一个个看看他们的具体用法:

1、字符串数组

下面是上图是实现上图效果的代码:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. String[] mItems = {"item0", "item1", "itme2", "item3", "itme4", "item5", "item6"};  
  2. AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);  
  3. builder.setIcon(R.drawable.ic_launcher);  
  4. builder.setTitle("使用列表字符串");  
  5. builder.setItems(mItems, new DialogInterface.OnClickListener() {  
  6.     @Override  
  7.     public void onClick(DialogInterface dialog, int which) {  
  8.         Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();  
  9.     }  
  10. });  
  11. builder.create();  
  12. builder.show();  
可以看到首先构造一个mItems数组,然后在buidler.setItems直接传进去就好了。至于DialogInterface.OnClickListener(){}函数就是对点击事件的监听,which表示当前点击的是哪个ITEM的索引。

2、字符串资源ID

首先在xml文件夹下建一个字符串资源XML,命名为:array.xml,位置如图:

详解Dialog(二)——有关列表的构建

然后定义一段字符串数组:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <string-array name="dialog_items">  
  4.         <item>王菲</item>  
  5.         <item>王力宏</item>  
  6.         <item>帅哥</item>  
  7.         <item>美女</item>  
  8.     </string-array>  
  9. </resources>  
下面就是利用SetItem来生成列表了:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);  
  2. builder.setIcon(R.drawable.ic_launcher);  
  3. builder.setTitle("使用Resource ID");  
  4. builder.setItems(R.array.dialog_items, new DialogInterface.OnClickListener() {  
  5.     @Override  
  6.     public void onClick(DialogInterface dialog, int which) {  
  7.         Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();  
  8.     }  
  9. });  
  10. builder.create();  
  11. builder.show();  
在这里的SetItems时直接将我们字符串数组的name直接设置进去,出来的效果就是这样的:

详解Dialog(二)——有关列表的构建

二、单选列表

单选列表的样式是这样的:

详解Dialog(二)——有关列表的构建

要实现单选列表,主要是通过下面四个其中之一来实现的:

方法一:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. setSingleChoiceItems(CharSequence[] items, int checkedItem, DialogInterface.OnClickListener listener)  
与上面一样,传进去一个字符串数组,和初始化时选中的ITEM,构造一个单选列表
方法二:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. setSingleChoiceItems (int itemsId, int checkedItem, DialogInterface.OnClickListener listener)  
同样,与上面的例子相同,这里传进去的是一个字符串数组的资源ID,字符串数组的构造方法与上面相同,就不再赘述

方法三:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. setSingleChoiceItems (ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener)  
这 个方法是最难理解的方法,因为这里的ListAdapter并不能是普通的Adapter,不信你传一个Adapter,保证出来只是你自己的ITEM视 图,旁边的单选按钮却出不来,其实这里的Adapter只是重写单选按钮旁的文字的样式,并不支持所有的Adapter,这个我会在本文最后讲述。
方法四:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. setSingleChoiceItems (Cursor cursor, int checkedItem, String labelColumn, DialogInterface.OnClickListener listener)  
这里通过传进去一个Cursor来构造对应的字符串数组,可以是数据库Cursor,也可以其它系统自带的数据Cursor,但基本上用不到,就不再讲了
好了,关于方法三,因为下面会接着讲SetAdapter的知识,所以这部分我留在最后再讲,这里先讲下方法一和方法二:

方法一和方法二,与上例没什么区别,下面我就以方法一以例来讲讲上面的效果图是怎么实现的吧:

代码如下:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. String[] mItems = {"攻", "受", "全能型", "不告诉你"};  
  2. AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);  
  3. builder.setIcon(R.drawable.ic_launcher);  
  4. builder.setTitle("你懂的");  
  5. builder.setSingleChoiceItems(mItems, 0, new DialogInterface.OnClickListener() {  
  6.     @Override  
  7.     public void onClick(DialogInterface dialog, int which) {  
  8.         // TODO Auto-generated method stub  
  9.         Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();  
  10.     }  
  11. });  
  12. builder.create();  
  13. builder.show();  
很简单,构造一个mItems的String字符串,然后直接传进去setSingleChoiceItems中,默认选中第一个,即索引是0的项。

三、多选列表

先看看效果图:

详解Dialog(二)——有关列表的构建

自带的多选构造函数有如下几个:

方法一:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. setMultiChoiceItems (CharSequence[] items, boolean[] checkedItems, DialogInterface.OnMultiChoiceClickListener listener)  
一样,传进去一个ITEMS数组和对应的项目的选中与否状态的数组;

方法二:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. setMultiChoiceItems (int itemsId, boolean[] checkedItems, DialogInterface.OnMultiChoiceClickListener listener)  
这里传进去的是一个字符串数组,与第一部分相同

方法三:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. setMultiChoiceItems (Cursor cursor, String isCheckedColumn, String labelColumn, DialogInterface.OnMultiChoiceClickListener listener)  
同样,这里传进去的是一个CURSOR,可以是数据库的指针,也可以是系统自带数据的指针,基本不怎么用,就不讲了

下面以方法一为例看看多选列表的构造过程:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. String[] mItems = {"经常犯二", "傻叉一枚", "逗逼", "小清纯", "沉稳大叔", "有时可爱"};  
  2. AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);  
  3. builder.setIcon(R.drawable.ic_launcher);  
  4. builder.setTitle("性格类型");  
  5. builder.setMultiChoiceItems(mItems,  
  6.         new boolean[]{false, false, false, false, false, false, false},  
  7.         new DialogInterface.OnMultiChoiceClickListener() {  
  8.   
  9.             @Override  
  10.             public void onClick(DialogInterface dialog, int which, boolean isChecked) {  
  11.                 Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();  
  12.             }  
  13.         }  
  14. );  
  15. builder.show();  
这里构造了两个数组,一个是字符串数组,另一个每项对应是否选中的boolean数组
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. String[] mItems = {"经常犯二", "傻叉一枚", "逗逼", "小清纯", "沉稳大叔", "有时可爱"};  
对应的选中项的布尔值数组:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. new boolean[]{false, false, false, false, false, false, false}  

四、自定义列表项

这节我带大家自定义列表项的实现,故名思义,就是每个ITEM都是我们自己来定义,使用我们自己的Adapter,先看看效果:

详解Dialog(二)——有关列表的构建
要实现自定义列表主要是造下面这个函数来实现的:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. setAdapter (ListAdapter adapter, DialogInterface.OnClickListener listener)  
直接将我们构造好的Adapter设置进去。

下面就带大家实现下图示中的视图:

1、构造Adapter

有关派生自BaseAdapter来构造ListViewAdapter的过程就不再细讲了,大家可以参考我以前的两篇文章:

1、《List控件使用---SimpleAdapter使用详解(一)》

2、《BaseAdapter——convertView回收机制与动态控件响应》

第 一篇现在看来着实太烂了,一直想重写又没时间来做,大家可以再搜搜网上的其它相关文章来学一下有关BaseAdapter的相关内容吧。第二篇有关 convertView的回收机制写的还是挺不错的,大家可以仔细看看,相信会对ListView的机制有一个更清晰的理解。废话不多说了,下面言转正 转,看看我们这里的ListAdapter的构造过程:

首先是单个Item的布局:(list_item.xml)

很简单,采用水平布局,左边一个图像,右边一个对应的TEXT,这里只是基本实现功能,大家完全可以在理解这篇文章的基础上派生出更复杂的视图

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  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="wrap_content"  
  5.     android:layout_height="match_parent">  
  6.     <ImageView  
  7.         android:id="@+id/item_imageview"  
  8.         android:layout_width="80dip"  
  9.         android:layout_height="80dip"  
  10.         android:scaleType="fitCenter"/>  
  11.     <TextView  
  12.         android:id="@+id/item_text"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="match_parent"  
  15.         android:gravity="center_vertical|left"  
  16.         android:textSize="20sp"/>  
  17. </LinearLayout>  
对应的视图类:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. private class ViewHolder{  
  2.     public TextView mTvTitle;  
  3.     public ImageView mImageView;  
  4. }  
其中有两个变量,一个存储对应的TextView,另一个存储对应的ImageView;

现在我们还需要一个类来存储视图类中TextView的标题字符串,和对应ImageView的图片资源的ID值,这就是我们的数据类:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. public static class DataHolder{  
  2.     public String title;  
  3.     public int ImageID;  
  4.     public DataHolder(String title,int imageID){  
  5.         this.title = title;  
  6.         this.ImageID = imageID;  
  7.     }  
  8. }  
我们先阶段性的看看我们的ListViewAdapter:

首先是派生自BaseAdapter,然后是构造函数,我们传进去一个DataHolder的列表,用来存储每个Item应该显示的内容

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. public class ListItemAdapter extends BaseAdapter {  
  2.     private List<DataHolder> mDataList = new ArrayList<DataHolder>();  
  3.     private LayoutInflater mInflater;  
  4.   
  5.     public ListItemAdapter(Context context, ArrayList<DataHolder> datalist) {  
  6.         if (datalist != null && datalist.size() > 0) {  
  7.             mDataList.addAll(datalist);  
  8.         }  
  9.         mInflater = LayoutInflater.from(context);  
  10.     }  
  11.     ………………  
  12. }  
然后是最关键的getView部分:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. public View getView(int position, View convertView, ViewGroup viewGroup) {  
  2.     ViewHolder holder = null;  
  3.     if (convertView == null) {  
  4.         holder=new ViewHolder();  
  5.         convertView = mInflater.inflate(R.layout.list_item, null);  
  6.         holder.mTvTitle = (TextView)convertView.findViewById(R.id.item_text);  
  7.         holder.mImageView = (ImageView)convertView.findViewById(R.id.item_imageview);  
  8.         convertView.setTag(holder);  
  9.   
  10.     }else {  
  11.         holder = (ViewHolder)convertView.getTag();  
  12.     }  
  13.     holder.mImageView.setImageResource(mDataList.get(position).ImageID);  
  14.     holder.mTvTitle.setText(mDataList.get(position).title);  
  15.   
  16.     return convertView;  
  17. }  
首先是通过covertView的tag来获取重复利用的convertView,这什么要这么写,看《BaseAdapter——convertView回收机制与动态控件响应》
然后是利用传进来的数据,初始化列表Item:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. holder.mImageView.setImageResource(mDataList.get(position).ImageID);  
  2. holder.mTvTitle.setText(mDataList.get(position).title);  
最后返回convertView,让系统去做绘图
到这里ListViewAdapter的构造过程就基本完成了,下面是完整的代码:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. /** 
  2.  * Created by harvic 
  3.  * date 2015-1-11 
  4.  * */  
  5. public class ListItemAdapter extends BaseAdapter {  
  6.     private List<DataHolder> mDataList = new ArrayList<DataHolder>();  
  7.     private LayoutInflater mInflater;  
  8.     public ListItemAdapter(Context context,ArrayList<DataHolder> datalist){  
  9.         if (datalist != null && datalist.size()>0){  
  10.             mDataList.addAll(datalist);  
  11.         }  
  12.         mInflater = LayoutInflater.from(context);  
  13.     }  
  14.     @Override  
  15.     public int getCount() {  
  16.         return mDataList.size();  
  17.     }  
  18.   
  19.     @Override  
  20.     public Object getItem(int position) {  
  21.         return mDataList.get(position);  
  22.     }  
  23.   
  24.     @Override  
  25.     public long getItemId(int position) {  
  26.         return position;  
  27.     }  
  28.   
  29.     @Override  
  30.     public View getView(int position, View convertView, ViewGroup viewGroup) {  
  31.         ViewHolder holder = null;  
  32.         if (convertView == null) {  
  33.   
  34.             holder=new ViewHolder();  
  35.   
  36.             convertView = mInflater.inflate(R.layout.list_item, null);  
  37.             holder.mTvTitle = (TextView)convertView.findViewById(R.id.item_text);  
  38.             holder.mImageView = (ImageView)convertView.findViewById(R.id.item_imageview);  
  39.             convertView.setTag(holder);  
  40.   
  41.         }else {  
  42.             holder = (ViewHolder)convertView.getTag();  
  43.         }  
  44.         holder.mImageView.setImageResource(mDataList.get(position).ImageID);  
  45.         holder.mTvTitle.setText(mDataList.get(position).title);  
  46.   
  47.         return convertView;  
  48.     }  
  49.   
  50.     private class ViewHolder{  
  51.         public TextView mTvTitle;  
  52.         public ImageView mImageView;  
  53.     }  
  54.     public static class DataHolder{  
  55.         public String title;  
  56.         public int ImageID;  
  57.         public DataHolder(String title,int imageID){  
  58.             this.title = title;  
  59.             this.ImageID = imageID;  
  60.         }  
  61.     }  
  62. }  

2、构造列表

在MainActivity中,首先是初始化我们的ListViewAdapter,要初始化Adapter,就要首先传进去一个DataHolder的数组,所有要先构造一个DataHolder的数组
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. private ArrayList<ListItemAdapter.DataHolder> initDataHolder(){  
  2.     ArrayList<ListItemAdapter.DataHolder> datalist = new ArrayList<ListItemAdapter.DataHolder>();  
  3.     ListItemAdapter.DataHolder data_1 = new ListItemAdapter.DataHolder("可爱萌宠1", R.drawable.animal1);  
  4.     ListItemAdapter.DataHolder data_2 = new ListItemAdapter.DataHolder("可爱萌宠2", R.drawable.animal2);  
  5.     ListItemAdapter.DataHolder data_3 = new ListItemAdapter.DataHolder("可爱萌宠3", R.drawable.animal3);  
  6.     ListItemAdapter.DataHolder data_4 = new ListItemAdapter.DataHolder("可爱萌宠4", R.drawable.animal4);  
  7.     datalist.add(data_1);  
  8.     datalist.add(data_2);  
  9.     datalist.add(data_3);  
  10.     datalist.add(data_4);  
  11.     return datalist;  
  12. }  
在构造完成数据列表之后,下面就是构造我们的自定义的列表了,我把整个对话框显示过程整合成了一个函数createCustomList,代码如下:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. private void createCustomList() {  
  2.     ArrayList<ListItemAdapter.DataHolder> dataHolders = initDataHolder();  
  3.     ListItemAdapter adapter = new ListItemAdapter(MyActivity.this, dataHolders);  
  4.     AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);  
  5.     builder.setIcon(R.drawable.ic_launcher);  
  6.     builder.setTitle("可爱萌宠");  
  7.     builder.setAdapter(adapter, new DialogInterface.OnClickListener() {  
  8.         @Override  
  9.         public void onClick(DialogInterface dialogInterface, int which) {  
  10.             Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();  
  11.         }  
  12.     });  
  13.     builder.create();  
  14.     builder.show();  
  15. }  
OK啦,到这,整个自列表项的内容就讲完了,下面再回过来给大家说说上面我们提到的有关单选列表自定义Adapter的问题。

五、有关单选列表自定义Adapter

这里主要讲的函数是第二部分单选列表中的方法三:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. setSingleChoiceItems (ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener)  
在第四部分,我们构造了一个ListAdapter,这里需要的也是同样的一个ListAdapter,那我们直接将第四部分中的Adapter传进去,会是什么效果呢?

也就是利用下面的代码:

我们直接在createCustomList()上面改一下,即把builder.setAdapter()直接换成setSingleChoiceItems() ,传进去Adpter,看看在我们定义的视图后面会不会出现一个单选按钮呢?

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. private void createCustomList() {  
  2.     ArrayList<ListItemAdapter.DataHolder> dataHolders = initDataHolder();  
  3.     ListItemAdapter adapter = new ListItemAdapter(MyActivity.this, dataHolders);  
  4.     AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);  
  5.     builder.setIcon(R.drawable.ic_launcher);  
  6.     builder.setTitle("可爱萌宠");  
  7.     builder.setSingleChoiceItems(adapter, 0,new DialogInterface.OnClickListener() {  
  8.         @Override  
  9.         public void onClick(DialogInterface dialogInterface, int which) {  
  10.             Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();  
  11.         }  
  12.     });  
  13.     builder.create();  
  14.     builder.show();  
  15. }  
运行一下,效果是这样的:

详解Dialog(二)——有关列表的构建

看见了没,毛也没有,坑爹玩意,那这个函数到底是用来做什么的呢,在源码中有这样一个文件:

地址在:$android_sdk_home/platforms/Android-x.x/data/res/layout/simple_list_item_single_choice.xml
文件内容是这样的:

[html] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:id="@+id/single_list_item"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="?android:attr/listPreferredItemHeightSmall"  
  5.     android:textAppearance="?android:attr/textAppearanceListItemSmall"  
  6.     android:gravity="center_vertical"  
  7.     android:checkMark="?android:attr/listChoiceIndicatorSingle"  
  8.     android:paddingStart="?android:attr/listPreferredItemPaddingStart"  
  9.     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"  
  10.   />  
利用这个玩意是可以实现效果的,我们来试一下。

1、新建Adapter

新建一个布局文件,来保存ListVIew的每项的Item,代码如下:
[html] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:id="@+id/single_list_item"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="?android:attr/listPreferredItemHeightSmall"  
  5.     android:textAppearance="?android:attr/textAppearanceListItemSmall"  
  6.     android:gravity="center_vertical"  
  7.     android:checkMark="?android:attr/listChoiceIndicatorSingle"  
  8.     android:paddingStart="?android:attr/listPreferredItemPaddingStart"  
  9.     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"  
  10.   />  
在Adapter中,同样,用来保存ITEM视图的ViewHolder类,如下:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. private class ViewHolder{  
  2.     public TextView  mName;  
  3. }  
因 为在布局中只有一个TextView,所以在ViewHolder中也只需要一个TextView与其对应,至于类似上面的承载对应数据的 DataHolder,因为我们只需要一个String字符串数组就足够了,所以就没必要再新建一个类来承载这些数据了,所以我们要构造Adapter 时,传进来一个字符串数组就好了:

所以简单的构造函数为:

在构造时,传进来我们每项要显示的标题的字符串数组String[] items,并将其直接添加到我们的List<String> mList中。

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. public class SingleChoiceAdapter extends BaseAdapter {  
  2.     private LayoutInflater mInflater;  
  3.     private List<String> mList = new ArrayList<String>();  
  4.   
  5.     public SingleChoiceAdapter(Context context, String[] items) {  
  6.         mInflater = LayoutInflater.from(context);  
  7.         if (items == null || items.length <= 0) {  
  8.             return;  
  9.         }  
  10.         for (String item : items) {  
  11.             mList.add(item);  
  12.         }  
  13.     }  
  14.   
  15.     …………  
  16. }  
然后是最关键的getView()部分:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. public View getView(int position, View convertView, ViewGroup viewGroup) {  
  2.     ViewHolder holder = null;  
  3.     if (convertView == null) {  
  4.   
  5.         holder=new ViewHolder();  
  6.   
  7.         convertView = mInflater.inflate(R.layout.single_choice_item, null);  
  8.         holder.mName = (TextView)convertView.findViewById(R.id.single_list_item);  
  9.         convertView.setTag(holder);  
  10.   
  11.     }else {  
  12.         holder = (ViewHolder)convertView.getTag();  
  13.     }  
  14.     holder.mName.setText(mList.get(position));  
  15.   
  16.     return convertView;  
  17. }  
这段代码难度不大,就是每次绘图时,将TextView的内容设置为我们指定的字符串:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. holder.mName.setText(mList.get(position));  
下面是SingleChoiceAdapter完整的代码:
[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. /** 
  2.  * Created by harvic 
  3.  * date 2015-1-11 
  4.  */  
  5. public class SingleChoiceAdapter extends BaseAdapter {  
  6.     private LayoutInflater mInflater;  
  7.     private List<String> mList = new ArrayList<String>();  
  8.     public SingleChoiceAdapter(Context context,String[] items){  
  9.         mInflater = LayoutInflater.from(context);  
  10.         if (items == null || items.length<=0){  
  11.             return;  
  12.         }  
  13.         for(String item:items){  
  14.             mList.add(item);  
  15.         }  
  16.     }  
  17.     @Override  
  18.     public int getCount() {  
  19.         return mList.size();  
  20.     }  
  21.   
  22.     @Override  
  23.     public Object getItem(int position) {  
  24.         return mList.get(position);  
  25.     }  
  26.   
  27.     @Override  
  28.     public long getItemId(int position) {  
  29.         return position;  
  30.     }  
  31.   
  32.     @Override  
  33.     public View getView(int position, View convertView, ViewGroup viewGroup) {  
  34.         ViewHolder holder = null;  
  35.         if (convertView == null) {  
  36.   
  37.             holder=new ViewHolder();  
  38.   
  39.             convertView = mInflater.inflate(R.layout.single_choice_item, null);  
  40.             holder.mName = (TextView)convertView.findViewById(R.id.single_list_item);  
  41.             convertView.setTag(holder);  
  42.   
  43.         }else {  
  44.             holder = (ViewHolder)convertView.getTag();  
  45.         }  
  46.         holder.mName.setText(mList.get(position));  
  47.   
  48.         return convertView;  
  49.     }  
  50.   
  51.     private class ViewHolder{  
  52.         public TextView  mName;  
  53.     }  
  54. }  
然后就是使用的阶段了

2、构造单选列表

这里首先构造SingleChoiceAdapter的实例,然后将其传入setSingleChoiceItems中,代码如下:

[java] view plain copy 详解Dialog(二)——有关列表的构建详解Dialog(二)——有关列表的构建
  1. String[] mItems = {"攻", "受", "全能型", "不告诉你"};  
  2. SingleChoiceAdapter adapter = new SingleChoiceAdapter(MyActivity.this,mItems);  
  3. AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);  
  4. builder.setIcon(R.drawable.ic_launcher);  
  5. builder.setTitle("可爱萌宠");  
  6. builder.setSingleChoiceItems(adapter, 0, new DialogInterface.OnClickListener() {  
  7.     @Override  
  8.     public void onClick(DialogInterface dialogInterface, int which) {  
  9.         Toast.makeText(MyActivity.this, "clicked:" + which, Toast.LENGTH_LONG).show();  
  10.     }  
  11. });  
  12. builder.create();  
  13. builder.show();  
运行出来的效果如图:

详解Dialog(二)——有关列表的构建
看到没,这里效果是出来了,可见,在单选按钮中,定义Adapter并不是随便定义的,只能定义CheckedTextView的视图,其它是不支持的!!!!

 

好了,到这里本篇就结束了,下篇给大家讲讲有关自定义对话框的内容。



本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5434828.html,如需转载请自行联系原作者