Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1566739
  • 博文数量: 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-17 09:44:43

    本文实现了一个带选择框的listview,其中参考到了android_diordna 的关于listview讲解的文章,从而实现了这样的一个Demo.
    在这个Demo中包含两个Activity,第一个是ListDemo.java,只有一个按钮,其主要作用是产生所要列出来的数据,并将这些数据发送出去。

  1. package com.test;

  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;

  9. import java.util.ArrayList;
  10. import java.util.HashMap;
  11. import java.util.List;
  12. import java.util.Map;

  13. public class ListDemo extends Activity implements OnClickListener{
  14.     private String TAG="listdemo";
  15.     //ArrayList adapter;
  16.     /** Called when the activity is first created. */
  17.     @Override
  18.     public void onCreate(Bundle savedInstanceState) {
  19.         super.onCreate(savedInstanceState);
  20.         setContentView(R.layout.main);
  21.         Button result=(Button)findViewById(R.id.result);
  22.         Log.d(TAG,"oncreate");
  23.         result.setOnClickListener(this);
  24.     }
  25.     @Override
  26.     public void onClick(View v) {
  27.         switch(v.getId()){
  28.             case R.id.result:
  29.                 Intent intent1=new Intent(this,ShowList1.class);
  30.                 //send music names
  31.                 intent1.putStringArrayListExtra("list", getData());
  32.                 startActivity(intent1);
  33.                 break;
  34.         }

  35.     }

  36.     private ArrayList<String> getData(){
  37.         ArrayList<String> list=new ArrayList<String>();
  38.         //create music names
  39.         for(int i=0;i<6;i++){
  40.             list.add(i, "music"+i);
  41.         }
  42.         return list;
  43.     }
  44. }
      可以看到,在这里用到的数据为ArrayList类型,也就是说在本例中ListView所要显示的数据即为这个ArrayList中的内容。另外这个Activity所要用的布局文件为main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android=""
  3.     android:orientation="vertical"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent"
  6.     >

  7.     <Button
  8.     android:id="@+id/result"
  9.     android:layout_width="fill_parent"
  10.     android:layout_height="wrap_content"
  11.     android:text="@string/result"
  12.     />
  13. </LinearLayout>
     在点击按钮后,会启动第二个Activity,即ShowList1.java 。这个类接收从Intent中传来的数据,并将这些数据在ListView中正确地显示出来。

  1. package com.test;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.view.ViewGroup;
  10. import android.widget.BaseAdapter;
  11. import android.widget.Button;
  12. import android.widget.CheckBox;
  13. import android.widget.CompoundButton;
  14. import android.widget.Toast;
  15. import android.widget.CompoundButton.OnCheckedChangeListener;
  16. import android.widget.ImageView;
  17. import android.widget.ListView;
  18. import android.widget.SimpleAdapter;
  19. import android.widget.TextView;
  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.     SimpleAdapter adapter;
  27.     ArrayList<Boolean> checkedItem=new ArrayList<Boolean>();

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

  43.     }
  44.     
  45.     /*
  46.      * (non-Javadoc)
  47.      * @see android.view.View.OnClickListener#onClick(android.view.View)
  48.      * see which has been choosed
  49.      */
  50.     @Override
  51.     public void onClick(View v) {
  52.         String s="You have choosed ";
  53.         for(int i=0;i<array.size();i++){
  54.             if(checkedItem.get(i)){
  55.                 s=s+","+array.get(i);
  56.             }
  57.         }
  58.         Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();
  59.     }

  60.     public final class ViewHolder{
  61.         public ImageView img;
  62.         public TextView name;
  63.         public CheckBox checked;
  64.     }

  65.     class CheckAdapter extends BaseAdapter{
  66.         private LayoutInflater mInflater;
  67.         public CheckAdapter(Context context){
  68.             this.mInflater=LayoutInflater.from(context);
  69.         }
  70.         public int getCount() {
  71.             return array.size();
  72.         }
  73.         public Object getItem(int position) {
  74.             return array.get(position);
  75.         }
  76.         public long getItemId(int position) {
  77.             return position;
  78.         }
  79.         public View getView(int position, View convertView, ViewGroup parent) {
  80.             final int p=position;
  81.             ViewHolder holder=null;
  82.             Log.d(TAG,"test");
  83.             if(convertView==null){
  84.                 holder=new ViewHolder();
  85.                 convertView=mInflater.inflate(R.layout.list, null);
  86.                 holder.img=(ImageView)convertView.findViewById(R.id.img);
  87.                 holder.name=(TextView)convertView.findViewById(R.id.name);
  88.                 holder.checked=(CheckBox)convertView.findViewById(R.id.select);
  89.                 convertView.setTag(holder);
  90.             }
  91.             else{
  92.                 holder = (ViewHolder) convertView.getTag();
  93.             }
  94.             holder.img.setBackgroundResource(R.drawable.icon);
  95.             final String s=(String)array.get(position);
  96.             holder.name.setText(s);
  97.             holder.checked.setOnCheckedChangeListener(new OnCheckedChangeListener(){
  98.                 @Override
  99.                 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  100.                     if(isChecked){
  101.                        //update the status of checkbox to checked
  102.                         Log.d(TAG,"checked");
  103.                         checkedItem.set(p, true);
  104.                     }else{
  105.                       //update the status of checkbox to unchecked
  106.                         checkedItem.set(p, false);
  107.                         Log.d(TAG,"unchecked");
  108.                     }

  109.                 }

  110.             });
  111.             return convertView;
  112.         }
  113.     }
  114. }
   
     在这里使用一个ArrayList checkedItem数据结构来保存选择框的选择结果,初始化的时候将其都置为false,即选择框处在未选中的状态。其中ViewHolder类用来指向listview中每一行的子view,每个子view包含img/name/checked三个成员,分别对应于图片/名称/选择框。值得一提的是如果不重写继承了BaseAdapter类的getView()方法,是无法对checkedbox添加点击响应事件的,在点击事件的响应里根据checkbox的状态更新checkeditem中对应位置的值就可以记录下哪些选择框被选中了。最后遍历checkedItem,其中值为true即为选中的行。这个Activity的布局文件为list1.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3.   xmlns:android=""
  4.   android:layout_width="match_parent"
  5.   android:layout_height="match_parent">
  6.    
  7.       <ListView android:id="@+id/listView"
  8.         android:layout_height="wrap_content"
  9.         android:layout_width="fill_parent">
  10.      </ListView>
  11.     <Button
  12.         android:id="@+id/result"
  13.         android:layout_centerHorizontal="true"
  14.         android:layout_alignParentBottom="true"
  15.         android:layout_width="wrap_content"
  16.         android:layout_height="wrap_content"
  17.         android:text="Result"/>
  18. </RelativeLayout>
        另外,对于每一列也需要有个布局文件,在这里为list.xml,在这里包含了三个部件,分别对应ViewHolder里的三个成员。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3.   xmlns:android=""
  4.   android:orientation="horizontal"
  5.   android:layout_width="match_parent"
  6.   android:layout_height="match_parent">
  7.   <ImageView
  8.     android:id="@+id/img"
  9.     android:layout_width="wrap_content"
  10.     android:layout_height="wrap_content"
  11.   />
  12.   <TextView
  13.     android:id="@+id/name"
  14.     android:layout_width="wrap_content"
  15.     android:layout_height="wrap_content"
  16.     android:layout_toRightOf="@id/img"
  17.   />
  18.   <CheckBox
  19.     android:id="@+id/select"   
  20.     android:layout_alignParentRight="true" 
  21.     android:layout_width="wrap_content"
  22.     android:layout_height="wrap_content"
  23.     android:checked="false"
  24.   />
  25. </RelativeLayout>
         最后程序的实现效果图如下图所示:


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