HardBirch

自定义Dialog(图片,文字说明,单选按钮)—-类ListPreference实现(2)

时间:11-08-04 栏目:安卓源码解析与小应用 作者:张飞不张,文采横飞 评论:0 点击: 5,142 次

在上一篇 中,只是实现一个perference,但是点击以后没有响应事件,我们可以定义一个一个Dialog,Dialog选项里面需要有图片,文字说明,后面还需要一个单选按钮,所以自己写了一个demo,效果图如下:

        功能的完成是使用Dialog的addView()方法,把一个ListView添加进去。ListView控件里面使用了ImageView和CheckedTextView控件,CheckedTextView是一个提供文字和选择框的控件。如果对于CheckedTextView不熟悉,请自己查下文档,在这里就不在多说。

主要功能代码如下:

public class ListViewActivityextends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        Button button=(Button)findViewById(R.id.button);

       //获取ListView

        final LayoutInflater factory = LayoutInflater.from(ListViewActivity.this); 

                 final View view = factory.inflate( 

                         R.layout.listview,null);

        final ListView list = (ListView) view.findViewById(R.id.ListView01); 

        //把数据项添加到listItem里面

        ArrayList<HashMap<String,Object>> listItem =newArrayList<HashMap<String, Object>>(); 

        for(int i=0;i<5;i++) 

        {

        if(i==0){

             HashMap<String,Object> map =new HashMap<String,Object>(); 

                map.put("ItemImage", R.drawable.checked);

                map.put("ItemTitle", "1");   

                listItem.add(map);

        }else if(i==1){

             HashMap<String,Object> map =new HashMap<String,Object>(); 

                map.put("ItemImage", R.drawable.c); 

                map.put("ItemTitle", "2"); 

                listItem.add(map);

        }else if(i==2){

             HashMap<String,Object> map =new HashMap<String,Object>(); 

                map.put("ItemImage", R.drawable.d); 

                map.put("ItemTitle", "3");  

                listItem.add(map);

        }else if(i==3){

             HashMap<String,Object> map =new HashMap<String,Object>(); 

                map.put("ItemImage", R.drawable.d); 

                map.put("ItemTitle", "4");   

                listItem.add(map);

        }else{

             HashMap<String,Object> map =new HashMap<String,Object>(); 

                map.put("ItemImage", R.drawable.e); 

                map.put("ItemTitle", "5");  

                listItem.add(map);

        }

        }

       //获得SimpleAdapter,并且把它添加到listView中

        SimpleAdapter listItemAdapter =new SimpleAdapter(this,listItem, 

               R.layout.item,         

               new String[] {"ItemImage","ItemTitle"},   

               new int[] {R.id.imageView,R.id.checkedTextView} 

           ); 

           list.setAdapter(listItemAdapter); 

           list.setOnItemClickListener(new OnItemClickListener(){ 

                public void onItemClick(AdapterView<?>arg0, View arg1,int arg2, 

                        long arg3) {

              //把所有的单选全部设为非选中

                 for(int i=0;i<arg0.getCount();i++)

                 {
                    View v = list.getChildAt(i);

                    CheckedTextViewcheckText=(CheckedTextView)v.findViewById(R.id.checkedTextView);

                    checkText.setChecked(false);

                 }
              //获得点击项的CheckedTextView,并设为选中
                 CheckedTextViewcheck=(CheckedTextView)arg1.findViewById(R.id.checkedTextView);
                  check.setChecked(true);
               }
           });

           final AlertDialog.Builder builder=new AlertDialog.Builder(ListViewActivity.this);
           button.setOnClickListener(new View.OnClickListener() {
              public void onClick(View v) {
                  builder.setTitle("Dialog");
                  builder.setView(list);
               builder.setNegativeButton("cencel",null);
               builder.create().show();
              }
           });
    }
}


其中item.xml代码如下

<?xml version="1.0"encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="horizontal"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

    <ImageView

       android:id="@+id/imageView" 

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        />

    <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/checkedTextView"

    android:layout_width="match_parent"

        android:layout_height="?android:attr/listPreferredItemHeight"

    android:textAppearance="?android:attr/textAppearanceLarge"

    android:gravity="center_vertical"

    android:checkMark="?android:attr/listChoiceIndicatorSingle"

    android:paddingLeft="6dip"

    android:paddingRight="6dip"

/>

</LinearLayout>

Listview.xml文件如下

<?xml version="1.0"encoding="utf-8"?>   

<ListView xmlns:android="http://schemas.android.com/apk/res/android"

         android:layout_width="wrap_content"  

          android:layout_height="wrap_content"  

          android:id="@+id/ListView01" 

          /> 

应该特别注意listview.xml不要把他写在一个父控件下如:LinearLayout等,如果这样会出现错误,。还有就是如果你listview添加过多选项,当单击的时候会出现空指针异常。

另外,Demo源代码可以在此下载。

http://download.csdn.net/source/3494251

2012年7月19号补充

           当listView中含有超过一屏幕的时候,采用以上方法会有空指针异常,是因为未显示的View为空,但是上面代码中要遍历所有代码,所以为空。如何优化,可以参考

ListView Item 选择问题解决之道

这篇文章。

      

自定义Dialog(图片,文字说明,单选按钮)—-类ListPreference实现(2):目前有

  1. 解决listview上 Item上有按钮时 item本身不能点击的问题:

    1. 在item试图上面添加代码: android:descendantFocusability="blocksDescendants"
    2.在listview里 添加代码 android:focusable="true"

    2011-08-30 14:01 [回复]
  2. 13楼
    sunway1016:

    onItemClick函数中的
    View v = arg0.getChildAt(i)
    会返回null
    导致达不到单选效果

    2011-10-14 14:56 [回复]
  3. [reply]sunway1016[/reply]
    你看的113行 # for(int i=0;i<arg0.getCount();i++)
    #
    # {
    # View v = list.getChildAt(i);
    #
    # CheckedTextViewcheckText=(CheckedTextView)v.findViewById(R.id.checkedTextView);
    #
    # checkText.setChecked(false);
    # 不是的阿 你是不是list定义的时候 有问题阿 ,这个例子是我自己写出来的,可以使用。

    2011-10-14 18:09 [回复]
  4. 11楼
    jdc0109:

    不错哦

    2011-12-05 15:33 [回复]
  5. [reply]jdc0109[/reply]
    呵呵 谢谢夸奖。。。

    2011-12-05 17:36 [回复]
  6. 9楼
    wei7275:

    大哥不带这样玩人的啊!资源文件怎么跟你的这个Demo不一样?

    2012-01-11 09:26 [回复]
  7. [reply]wei7275[/reply]
    恩,当时可能是根据那个源代码修改的,上传的是原始的源代码,现在,我也记不太清楚了,不好意思,请问你想解决什么问题?在上面的代码里面能够找到解决方法吗?

    2012-01-11 09:42 [回复]
  8. [reply]wei7275[/reply]
    可以啊,为什么不可以呢???

    2012-01-11 09:43 [回复]
  9. 6楼
    wei7275:

    [reply]aomandeshangxiao[/reply]
    上面的解决不了,我是自写一个ListView的SimpleAdapter 每个list 的 item 里添加3个Button 点击Button时改变点击的哪个的背景,我现在是点击后都是最后一个Button的背景改变。

    2012-01-11 10:06 [回复]
  10. [reply]wei7275[/reply]
    button 改成imageview或者imageButton行不行啊?

    2012-01-11 10:24 [回复]
  11. [reply]wei7275[/reply]
    你看下124行的代码: CheckedTextViewcheck=(CheckedTextView)arg1.findViewById(R.id.checkedTextView);
    check.setChecked(true); arg1就是你点击的那个view,你可以获取你点击的那个控件,然后再操作会出现错误?

    2012-01-11 10:26 [回复]
  12. [reply]wei7275[/reply]
    for(int i=0;i<arg0.getCount();i++)

    {
    View v = list.getChildAt(i);
    CheckedTextViewcheckText=(CheckedTextView)v.findViewById(R.id.checkedTextView);
    checkText.setChecked(false);
    } 据我猜想,你是不是使用了从113行开始的上面的代码啊?我上面这些代码的意思是,把所有的选项都设为非选中状态,你要是通过一个循环,最后得到的那个button肯定是最后一个button啊,不知道我说的对不对。你再好好看看你的代码??有什么不明白的欢迎探讨。

    2012-01-11 10:29 [回复]
  13. 板凳
    Aria_zuo:

    "当listView中含有超过一屏幕的时候,采用以上方法会有空指针异常,是因为未显示的View为空,但是上面代码中要遍历所有代码,所以为空"这个问题要怎么解决啊?我的就是出现了空指针异常了~

    2012-09-04 15:22 [回复]
  14. [reply]Aria_zuo[/reply]
    http://blog.csdn.net/aomandeshangxiao/article/details/7681380

    话说我下面斗给你连接了啊。。。郁闷。

    2012-09-04 15:56 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐