Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1570935
  • 博文数量: 113
  • 博客积分: 3526
  • 博客等级: 中校
  • 技术积分: 1815
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-08 09:46
个人简介

记录总结自己的工作

文章分类

全部博文(113)

文章存档

2015年(19)

2014年(10)

2013年(6)

2012年(16)

2011年(24)

2010年(21)

2009年(17)

分类: 嵌入式

2011-03-29 13:33:58

 

    在上一篇文章中实现了一个带选择框的listview。但是那个例子有个.很严重的问题:必须点击选择框才能选择该列,这在模拟器上没有什么大问题,可是在手机上时问题就来了。手机的屏幕一般很小,那个选择框也会变得很小,如果有些人的指头又粗的话,点击选择框是件很不爽的问题。一般的listview都要支持对整个列的点击响应,在本例中就实现来这个功能。 

    这个例子是基于上个例子来实现的,只是做了一些修改,下面只对修改的地方做出说明。修改主要体现在showlist1.java上。这里用到了ListView.CHOICE_MODE_MULTIPLE,在androidAPIDEMO中实现带选择框的listview时就使用来该参数,设置来该参数后,每次点击listview都会n(n是要显示的条目数)次调用重写的getview方法来更新各个条目的选择状态。在对Listitem的点击事件中,更新记录条目选择状态的ArrayList CheckItemm,这也是getview方法用来更新显示状态的依据。另外本例中去掉来上次中所用到的checkbox,而使用了CheckedTextView来代替,使实现起来能够更加容易。值得一提的是,通过重写getview方法,我们可以得到任何想要的view,也就是说,在listview每一行都是一个view,该view即为getview方法的返回值。



  1. package com.test;

  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.view.ViewGroup;
  12. import android.widget.AdapterView;
  13. import android.widget.AdapterView.OnItemClickListener;
  14. import android.widget.BaseAdapter;
  15. import android.widget.Button;
  16. import android.widget.CheckedTextView;
  17. import android.widget.ImageView;
  18. import android.widget.ListView;
  19. import android.widget.Toast;

  20. import java.util.ArrayList;


  21. public class ShowList1 extends Activity implements OnClickListener {
  22.     private String TAG="showlist1";
  23.     ListView list;
  24.     Button button;
  25.     ArrayList<String> array;
  26.     ArrayList<Boolean> checkedItem=new ArrayList<Boolean>();
  27.     private Bitmap mIcon1;
  28.     CheckAdapter chadapter;

  29.     public void onCreate(Bundle savedInstanceState) {
  30.         super.onCreate(savedInstanceState);
  31.         mIcon1 = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon48x48_1);
  32.         setContentView(R.layout.list1);
  33.         list=(ListView)findViewById(R.id.listView);
  34.         button=(Button)findViewById(R.id.result);
  35.         button.setOnClickListener(this);
  36.         //get music names from other activity
  37.         array=getIntent().getStringArrayListExtra("list");
  38.         //init the check box status to unchecked
  39.         for(int i=0;i<array.size();i++){
  40.             checkedItem.add(i,false);
  41.         }
  42.         Log.d(TAG,array.toString());
  43.        chadapter=new CheckAdapter(this);
  44.        list.setAdapter(chadapter);
  45.        list.setItemsCanFocus(false);
  46.        list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  47.        list.setOnItemClickListener(new OnItemClickListener(){
  48.             public void onItemClick(AdapterView<?> parent, Viewview, int position, long id) {
  49.                 //update the value of checked items
  50.                 if(checkedItem.get(position)==true){
  51.                     checkedItem.set(position,false);
  52.                     Log.d(TAG,"true");
  53.                 }
  54.                 else{
  55.                     checkedItem.set(position,true);
  56.                     Log.d(TAG,"false");
  57.                 }
  58.             }
  59.         });
  60.     }

  61.     /*
  62.      * (non-Javadoc)
  63.      * @see android.view.View.OnClickListener#onClick(android.view.View)
  64.      * see which has been choosed
  65.      */
  66.     @Override
  67.     public void onClick(View v) {
  68.         String s="You have choosed ";
  69.         for(int i=0;i<array.size();i++){
  70.             if(checkedItem.get(i)){
  71.                 s=s+","+array.get(i);
  72.             }
  73.         }
  74.         Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
  75.     }

  76.     class CheckAdapter extends BaseAdapter {
  77.         private LayoutInflater mInflater;
  78.         public CheckAdapter(Context context){
  79.             this.mInflater=LayoutInflater.from(context);
  80.         }

  81.         public int getCount() {
  82.             return array.size();
  83.         }
  84.         public Object getItem(int position) {
  85.             return position;
  86.         }
  87.         public long getItemId(int position) {
  88.             return position;
  89.         }
  90.         public View getView(int position, View convertView, ViewGroup parent) {
  91.             Log.d(TAG,"getview");
  92.             ImageView img;
  93.             CheckedTextView name;
  94.             View view;
  95.             final int p=position;
  96.             if(convertView==null){
  97.                 view=mInflater.inflate(R.layout.api,parent,false);
  98.             }
  99.             else{
  100.                 view=convertView;
  101.             }
  102.             img=(ImageView)view.findViewById(R.id.img);
  103.             name=(CheckedTextView)view.findViewById(R.id.text);
  104.             img.setImageBitmap(mIcon1);
  105.             final String s=(String)array.get(position);
  106.             name.setText(s);
  107.             //display which item has been checked
  108.             if(checkedItem.get(p)==true)
  109.                 name.setChecked(true);
  110.             else
  111.                 name.setChecked(false);
  112.             return view;
  113.         }
  114.     }
  115. }

     最后修改的地方是布局文件,该文件命名为api.xml。在其中主有有两部分,分别是ImageView和CheckedTextView,实现的界面同上例中的界面是相同的,图片就不再贴出了。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3.   xmlns:android=""
  4.   android:orientation="horizontal"
  5.   android:layout_width="wrap_content"
  6.   android:layout_height="wrap_content">
  7.  <ImageView
  8.     android:id="@+id/img"
  9.     android:layout_width="48dip"
  10.     android:layout_height="48dip" 
  11.     android:layout_marginTop="7.0dip"
  12.     android:layout_marginLeft="5.0dip"
  13.     android:layout_marginRight="5.0dip" 
  14.   />
  15. <CheckedTextView xmlns:android=""
  16.     android:id="@+id/text"
  17.     android:layout_width="fill_parent"
  18.     android:layout_height="?android:attr/listPreferredItemHeight"
  19.     android:textAppearance="?android:attr/textAppearanceLarge"
  20.     android:gravity="center_vertical"
  21.     android:checkMark="?android:attr/listChoiceIndicatorMultiple"
  22.     android:paddingLeft="6dip"
  23.     android:paddingRight="6dip"
  24.     android:layout_toRightOf="@id/img"
  25. />
  26. </RelativeLayout>






阅读(3647) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~