大佬教程收集整理的这篇文章主要介绍了详解Dialog(二)——有关列表的构建,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
上篇给大家讲了Dialog的基本元素的构建方法,今天给大家说说有关列表对话框的构建。本篇讲的所有列表项都是通过系统自带的函数生成的,对于完全自定义对话框的方法,我们会在最后一篇讲。
列表对话框主要有四种:普通列表、单选列表、双选列表、自定义视图的列表,下面我们一个个来分析。
普通列表的样式@R_489_9811@:
要实现这样的列表样式,是通过下面的方法来实现的:
builder.setItems(CharSequence[] items,DialogInterface.onClickListener listener)
builder.setItems(int itemsId,DialogInterface.onClickListener listener)
setItems(CharSequence[] items,DialogInterface.onClickListener listener)
这个items传进去的是一个字符串数组;
setItems(int itemsId,DialogInterface.onClickListener listener)
这个传进去的一个itemsId,是在XML中定义好的一个字符串数组资源的ID;
String[] mItems = {"item0","item1","itme2","item3","itme4","item5","item6"};
AlertDialog.builder builder = new AlertDialog.builder(MyActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.settitle("使用列表字符串");
builder.setItems(mItems,new DialogInterface.onClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
Toast.makeText(MyActivity.this,"clicked:" + which,Toast.LENGTH_LONG).show();
}
});
builder.create();
builder.show();
可以看到首先构造@L_932_7@mItems数组,然后在buidler.setItems直接传进去就好了。至于DialogInterface.onClickListener(){}函数就是对点击事件的监听,which表示当前点击的是哪个ITEM的索引。
首先在xml文件夹下建一个字符串资源XML,命名为:array.xml,位置如图:
然后定义一段字符串数组:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<String-array name="dialog_items">
<item>王菲</item>
<item>王力宏</item>
<item>帅哥</item>
<item>美女</item>
</String-array>
</resources>
下面就是利用SetItem来生成列表了:
AlertDialog.builder builder = new AlertDialog.builder(MyActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.settitle("使用resource ID");
builder.setItems(R.array.dialog_items,Toast.LENGTH_LONG).show();
}
});
builder.create();
builder.show();
在这里的SetItems时直接将我们字符串数组的name直接设置进去,出来的效果就@R_489_9811@:
单选列表的样式@R_489_9811@:
要实现单选列表,主要是通过下面四个其中之一来实现的:
方法一:
setSingleChoiceItems(CharSequence[] items,int checkedItem,DialogInterface.onClickListener listener)
与上面一样,传进去一个字符串数组,和初始化时选中的ITEM,构造一个单选列表
方法二:
setSingleChoiceItems (int itemsId,DialogInterface.onClickListener listener)
同样,与上面的例子相同,这里传进去的是一个字符串数组的资源ID,字符串数组的构造方法与上面相同,就不再赘述
方法三:
setSingleChoiceItems (listadapter adapter,DialogInterface.onClickListener listener)
这个方法是最难理解的方法,因为这里的listadapter并不能是普通的Adapter,不信你传一个Adapter,保证出来只是你自己的ITEM视图,旁边的单选按钮却出不来,其实这里的Adapter只是重写单选按钮旁的文字的样式,并不支持所有的Adapter,这个我会在本文最后讲述。
方法四:
setSingleChoiceItems (cursor cursor,String labelcolumn,DialogInterface.onClickListener listener)
这里通过传进去一个cursor来构造对应的字符串数组,可以是数据库cursor,也可以其它系统自带的数据cursor,但基本上用不到,就不再讲了
好了,关于方法三,因为下面会接着讲SetAdapter的知识,所以这部分我留在最后再讲,这里先讲下方法一和方法二:
方法一和方法二,与上例没什么区别,下面我就以方法一以例来讲讲上面的效果图是怎么实现的吧:
代码如下:
String[] mItems = {"攻","受","全能型","不告诉你"};
AlertDialog.builder builder = new AlertDialog.builder(MyActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.settitle("你懂的");
builder.setSingleChoiceItems(mItems,int which) {
// TODO Auto-generated method stub
Toast.makeText(MyActivity.this,Toast.LENGTH_LONG).show();
}
});
builder.create();
builder.show();
很简单,构造@L_932_7@mItems的String字符串,然后直接传进去setSingleChoiceItems中,默认选中第一个,即索引是0的项。
先看看效果图:
方法一:
setMultiChoiceItems (CharSequence[] items,Boolean[] checkedItems,DialogInterface.onMultiChoiceClickListener listener)
一样,传进去一个ITEMS数组和对应的项目的选中与否状态的数组;
方法二:
setMultiChoiceItems (int itemsId,DialogInterface.onMultiChoiceClickListener listener)
这里传进去的是一个字符串数组,与第一部分相同
方法三:
setMultiChoiceItems (cursor cursor,String ischeckedcolumn,DialogInterface.onMultiChoiceClickListener listener)
同样,这里传进去的是一个cursOR,可以是数据库的指针,也可以是系统自带数据的指针,基本不怎么用,就不讲了
下面以方法一为例看看多选列表的构造过程:
String[] mItems = {"经常犯二","傻叉一枚","逗逼","小清纯","沉稳大叔","有时可爱"};
AlertDialog.builder builder = new AlertDialog.builder(MyActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.settitle("性格类型");
builder.setMultiChoiceItems(mItems,new Boolean[]{@R_801_11372@se,@R_801_11372@se,@R_801_11372@sE},new DialogInterface.onMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog,int which,Boolean ischecked) {
Toast.makeText(MyActivity.this,Toast.LENGTH_LONG).show();
}
}
);
builder.show();
这里构造了两个数组,一个是字符串数组,另一个每项对应是否选中的Boolean数组
String[] mItems = {"经常犯二","有时可爱"};
对应的选中项的布尔值数组:
new Boolean[]{@R_801_11372@se,@R_801_11372@sE}
这节我带大家自定义列表项的实现,故名思义,就是每个ITEM都是我们自己来定义,使用我们自己的Adapter,先看看效果:
setAdapter (listadapter adapter,DialogInterface.onClickListener listener)
直接将我们构造好的Adapter设置进去。
下面就带大家实现下图示中的视图:
有关派生自BaseAdapter来构造ListViewAdapter的过程就不再细讲了,大家可以参考我以前的两篇文章:
首先是单个Item的布局:(list_item.xml)
很简单,采用水平布局,左边一个图像,右边一个对应的TEXT,这里只是基本实现功能,大家完全可以在理解这篇文章的基础上派生出更复杂的视图
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://scheR_889_11845@as.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<ImageView
android:id="@+id/item_imageview"
android:layout_width="80dip"
android:layout_height="80dip"
android:scaleType="fitCenter"/>
<TextView
android:id="@+id/item_text"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical|left"
android:textSize="20sp"/>
</LinearLayout>
对应的视图类:
private class ViewHolder{
public TextView mTvtitle;
public ImageView mImageView;
}
其中有两个变量,一个存储对应的TextView,另一个存储对应的ImageView;
现在我们还需要一个类来存储视图类中TextView的标题字符串,和对应ImageView的图片资源的ID值,这就是我们的数据类:
public static class DataHolder{
public String title;
public int ImagEID;
public DataHolder(String title,int imagEID){
this.title = title;
this.ImagEID = imagEID;
}
}
我们先阶段性的看看我们的ListViewAdapter:
首先是派生自BaseAdapter,然后是构造函数,我们传进去一个DataHolder的列表,用来存储每个Item应该显示的内容
public class ListItemAdapter extends BaseAdapter {
private List<DataHolder> mDataList = new ArrayList<DataHolder>();
private LayoutInflater mInflater;
public ListItemAdapter(Context context,ArrayList<DataHolder> datalist) {
if (datalist != null && datalist.size() > 0) {
mDataList.addAll(datalist);
}
mInflater = LayoutInflater.from(context);
}
………………
}
然后是最关键的getView部分:
public View getView(int position,View convertView,ViewGroup viewGroup) {
ViewHolder holder = null;
if (convertView == null) {
holder=new ViewHolder();
convertView = mInflater.inflate(R.layout.list_item,null);
holder.mTvtitle = (TextView)convertView.findViewById(R.id.item_text);
holder.mImageView = (ImageView)convertView.findViewById(R.id.item_imageview);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
holder.mImageView.setImageresource(mDataList.get(position).ImagEID);
holder.mTvtitle.setText(mDataList.get(position).titlE);
return convertView;
}
holder.mImageView.setImageresource(mDataList.get(position).ImagEID);
holder.mTvtitle.setText(mDataList.get(position).titlE);
最后返回convertView,让系统去做绘图
到这里ListViewAdapter的构造过程就基本完成了,下面是完整的代码:
/**
* Created by harvic
* date 2015-1-11
* */
public class ListItemAdapter extends BaseAdapter {
private List<DataHolder> mDataList = new ArrayList<DataHolder>();
private LayoutInflater mInflater;
public ListItemAdapter(Context context,ArrayList<DataHolder> datalist){
if (datalist != null && datalist.size()>0){
mDataList.addAll(datalist);
}
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mDataList.size();
}
@Override
public Object getItem(int position) {
return mDataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position,ViewGroup viewGroup) {
ViewHolder holder = null;
if (convertView == null) {
holder=new ViewHolder();
convertView = mInflater.inflate(R.layout.list_item,null);
holder.mTvtitle = (TextView)convertView.findViewById(R.id.item_text);
holder.mImageView = (ImageView)convertView.findViewById(R.id.item_imageview);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
holder.mImageView.setImageresource(mDataList.get(position).ImagEID);
holder.mTvtitle.setText(mDataList.get(position).titlE);
return convertView;
}
private class ViewHolder{
public TextView mTvtitle;
public ImageView mImageView;
}
public static class DataHolder{
public String title;
public int ImagEID;
public DataHolder(String title,int imagEID){
this.title = title;
this.ImagEID = imagEID;
}
}
}
在MainActivity中,首先是初始化我们的ListViewAdapter,要初始化Adapter,就要首先传进去一个DataHolder的数组,所有要先构造一个DataHolder的数组
private ArrayList<ListItemAdapter.DataHolder> initDataHolder(){
ArrayList<ListItemAdapter.DataHolder> datalist = new ArrayList<ListItemAdapter.DataHolder>();
ListItemAdapter.DataHolder data_1 = new ListItemAdapter.DataHolder("可爱萌宠1",R.drawable.animal1);
ListItemAdapter.DataHolder data_2 = new ListItemAdapter.DataHolder("可爱萌宠2",R.drawable.animal2);
ListItemAdapter.DataHolder data_3 = new ListItemAdapter.DataHolder("可爱萌宠3",R.drawable.animal3);
ListItemAdapter.DataHolder data_4 = new ListItemAdapter.DataHolder("可爱萌宠4",R.drawable.animal4);
datalist.add(data_1);
datalist.add(data_2);
datalist.add(data_3);
datalist.add(data_4);
return datalist;
}
在构造完成数据列表之后,下面就是构造我们的自定义的列表了,我把整个对话框显示过程整合成了一个函数createCustomList,代码如下:
private void createCustomList() {
ArrayList<ListItemAdapter.DataHolder> dataHolders = initDataHolder();
ListItemAdapter adapter = new ListItemAdapter(MyActivity.this,dataHolders);
AlertDialog.builder builder = new AlertDialog.builder(MyActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.settitle("可爱萌宠");
builder.setAdapter(adapter,new DialogInterface.onClickListener() {
@Override
public void onClick(DialogInterface dialogInterface,int which) {
Toast.makeText(MyActivity.this,Toast.LENGTH_LONG).show();
}
});
builder.create();
builder.show();
}
OK啦,到这,整个自列表项的内容就讲完了,下面再回过来给大家说说上面我们提到的有关单选列表自定义Adapter的问题。
setSingleChoiceItems (listadapter adapter,DialogInterface.onClickListener listener)
在第四部分,我们构造了一个listadapter,这里需要的也是同样的一个listadapter,那我们直接将第四部分中的Adapter传进去,会是什么效果呢?
也就是利用下面的代码:
我们直接在createCustomList()上面改一下,即把builder.setAdapter()直接换成setSingleChoiceItems() ,传进去Adpter,看看在我们定义的视图后面会不会出现一个单选按钮呢?
private void createCustomList() {
ArrayList<ListItemAdapter.DataHolder> dataHolders = initDataHolder();
ListItemAdapter adapter = new ListItemAdapter(MyActivity.this,dataHolders);
AlertDialog.builder builder = new AlertDialog.builder(MyActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.settitle("可爱萌宠");
builder.setSingleChoiceItems(adapter,Toast.LENGTH_LONG).show();
}
});
builder.create();
builder.show();
}
看见了没,毛也没有,坑爹玩意,那这个函数到底是用来做什么的呢,在源码中有这样一个文件:
地址在:$android_sdk_home/platforms/android-x.x/data/res/layout/simple_list_item_single_choice.xml
文件内容@R_489_9811@:
<checkedTextView xmlns:android="http://scheR_889_11845@as.android.com/apk/res/android"
android:id="@+id/single_list_item"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeightsmall"
android:textAppearance="?android:attr/textAppearanceListItemsmall"
android:gravity="center_vertical"
android:checkmark="?android:attr/listChoiceInDicatorSingle"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingend="?android:attr/listPreferredItemPaddingend"
/>
新建一个布局文件,来保存ListVIew的每项的Item,代码如下:
<checkedTextView xmlns:android="http://scheR_889_11845@as.android.com/apk/res/android"
android:id="@+id/single_list_item"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeightsmall"
android:textAppearance="?android:attr/textAppearanceListItemsmall"
android:gravity="center_vertical"
android:checkmark="?android:attr/listChoiceInDicatorSingle"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingend="?android:attr/listPreferredItemPaddingend"
/>
在Adapter中,同样,用来保存ITEM视图的ViewHolder类,如下:
private class ViewHolder{
public TextView mname;
}
因为在布局中只有一个TextView,所以在ViewHolder中也只需要一个TextView与其对应,至于类似上面的承载对应数据的DataHolder,因为我们只需要一个String字符串数组就足够了,所以就没必要再新建一个类来承载这些数据了,所以我们要构造Adapter时,传进来一个字符串数组就好了:
所以简单的构造函数为:
在构造时,传进来我们每项要显示的标题的字符串数组String[] items,并将其直接添加到我们的List<String> mList中。
public class SingleChoiceAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<String> mList = new ArrayList<String>();
public SingleChoiceAdapter(Context context,String[] items) {
mInflater = LayoutInflater.from(context);
if (items == null || items.length <= 0) {
return;
}
for (String item : items) {
mList.add(item);
}
}
…………
}
然后是最关键的getView()部分:
public View getView(int position,ViewGroup viewGroup) {
ViewHolder holder = null;
if (convertView == null) {
holder=new ViewHolder();
convertView = mInflater.inflate(R.layout.single_choice_item,null);
holder.mname = (TextView)convertView.findViewById(R.id.single_list_item);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
holder.mname.setText(mList.get(position));
return convertView;
}
这段代码难度不大,就是每次绘图时,将TextView的内容设置为我们指定的字符串:
holder.mname.setText(mList.get(position));
下面是SingleChoiceAdapter完整的代码:
/**
* Created by harvic
* date 2015-1-11
*/
public class SingleChoiceAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<String> mList = new ArrayList<String>();
public SingleChoiceAdapter(Context context,String[] items){
mInflater = LayoutInflater.from(context);
if (items == null || items.length<=0){
return;
}
for(String item:items){
mList.add(item);
}
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position,ViewGroup viewGroup) {
ViewHolder holder = null;
if (convertView == null) {
holder=new ViewHolder();
convertView = mInflater.inflate(R.layout.single_choice_item,null);
holder.mname = (TextView)convertView.findViewById(R.id.single_list_item);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
holder.mname.setText(mList.get(position));
return convertView;
}
private class ViewHolder{
public TextView mname;
}
}
然后就是使用的阶段了
这里首先构造SingleChoiceAdapter的实例,然后将其传入setSingleChoiceItems中,代码如下:
String[] mItems = {"攻","不告诉你"};
SingleChoiceAdapter adapter = new SingleChoiceAdapter(MyActivity.this,mItems);
AlertDialog.builder builder = new AlertDialog.builder(MyActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.settitle("可爱萌宠");
builder.setSingleChoiceItems(adapter,new DialogInterface.onClickListener() {
@Override
public void onClick(DialogInterface dialogInterface,Toast.LENGTH_LONG).show();
}
});
builder.create();
builder.show();
运行出来的效果如图:
看到没,这里效果是出来了,可见,在单选按钮中,定义Adapter并不是随便定义的,只能定义checkedTextView的视图,其它是不支持的!!!!
好了,到这里本篇就结束了,下篇给大家讲讲有关自定义对话框的内容。
以上是大佬教程为你收集整理的详解Dialog(二)——有关列表的构建全部内容,希望文章能够帮你解决详解Dialog(二)——有关列表的构建所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。