分别使用simpleAdapter和baseAdapter为ListView的Item添加按钮响应事件

   昨天在ListView Item上添加ImageButton时,发现item点击没响应,上网查找时发现有的文章认为不能使用simpleAdapter为ListView的item添加按钮响应事件,有的则认为simpleAdapter可以。下面一起解决这两个问题:

1.亲测可以分别使用simpleAdapter和baseAdapter为ListView的Item添加按钮响应事件。

(1)使用simpleAdapter为listView的item添加按钮响应事件

         MainActivity.java

  1. package com.example.arrayadapter;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6.   
  7. import android.app.Activity;  
  8. import android.os.Bundle;  
  9. import android.view.Menu;  
  10. import android.view.MenuItem;  
  11. import android.view.View;  
  12. import android.widget.AdapterView;  
  13. import android.widget.AdapterView.OnItemClickListener;  
  14. import android.widget.ListView;  
  15. import android.widget.Toast;  
  16.   
  17.   
  18. /** 
  19.  * 继承simpleAdapter实现listView每个Item上面的按钮添加事件 
  20.  * 
  21.  */  
  22. public class MainActivity extends Activity {  
  23.       
  24.     private ListView lv ;       //声明一个列表  
  25.     /* 显示ListView的两种方法: 
  26.      * 1)在activity对应的布局里声明ListView控件,使用findViewById初始listView对象,最后listView.setAdapter显示listVIew 
  27.      * 2)直接初始化ListVIew = new ListView(this),setAdapter后,通过setContentView(listView)把listView显示出来 
  28.      */  
  29.     @Override  
  30.     protected void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_main);  
  33.         lv = (ListView)findViewById(R.id.listview) ;         
  34. //        lv = new ListView(this) ;  
  35.         //String[]的img 要和int[]的img名称一致  
  36.         MySimpleAdapter adapter = new MySimpleAdapter(this,getData(),R.layout.item,  
  37.                 new String[]{"view1","view2","img","imageButton"},  
  38.                 new int[]{R.id.view1,R.id.view2,R.id.img,R.id.imageButton}) ;  
  39.           
  40.         lv.setAdapter(adapter) ;  
  41. //        setContentView(lv) ;  
  42.           
  43.         //添加监听器  
  44.       lv.setOnItemClickListener(new OnItemClickListener(){  
  45.   
  46.             @Override  
  47.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
  48.                     long arg3) {  
  49.                 // TODO Auto-generated method stub  
  50.                 Toast.makeText(MainActivity.this"点击的是ListView的item:"+arg2, Toast.LENGTH_LONG).show() ;  
  51.             }  
  52.           
  53.       }) ;  
  54.           
  55.     }  
  56.   
  57.   
  58.     private ArrayList<Map<String,Object>> getData()  
  59.     {  
  60.         ArrayList<Map<String,Object>> data = new ArrayList<Map<String,Object>>() ;  
  61.         Map<String,Object> item ;  
  62.         item = new HashMap<String,Object>() ;  
  63.         item.put("view1""张三") ;  
  64.         item.put("view2""23") ;  
  65.         item.put("img", R.drawable.ic_launcher) ;  
  66.         item.put("imageButton", R.drawable.ic_launcher) ;  
  67.         data.add(item) ;  
  68.         item = new HashMap<String,Object>() ;  
  69.         item.put("view1""李四") ;  
  70.         item.put("view2""20") ;  
  71.         item.put("img", R.drawable.ic_launcher) ;  
  72.         item.put("imageButton", R.drawable.ic_launcher) ;  
  73.         data.add(item) ;  
  74.         return data ;  
  75.     }  
  76.     @Override  
  77.     public boolean onCreateOptionsMenu(Menu menu) {  
  78.         // Inflate the menu; this adds items to the action bar if it is present.  
  79.         getMenuInflater().inflate(R.menu.main, menu);  
  80.         return true;  
  81.     }  
  82.   
  83.     @Override  
  84.     public boolean onOptionsItemSelected(MenuItem item) {  
  85.         // Handle action bar item clicks here. The action bar will  
  86.         // automatically handle clicks on the Home/Up button, so long  
  87.         // as you specify a parent activity in AndroidManifest.xml.  
  88.         int id = item.getItemId();  
  89.         if (id == R.id.action_settings) {  
  90.             return true;  
  91.         }  
  92.         return super.onOptionsItemSelected(item);  
  93.     }  
  94. }  
        MySimpleAdapter.java
  1. package com.example.arrayadapter;  
  2.   
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import android.content.Context;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.view.ViewGroup;  
  10. import android.widget.ImageButton;  
  11. import android.widget.SimpleAdapter;  
  12. import android.widget.Toast;  
  13.   
  14. public class MySimpleAdapter extends SimpleAdapter {  
  15.   
  16.     Context context ;  
  17.     public MySimpleAdapter(Context context,  
  18.             List<? extends Map<String, ?>> data, int resource, String[] from,  
  19.             int[] to) {  
  20.         super(context, data, resource, from, to);  
  21.         this.context = context ;   
  22.         // TODO Auto-generated constructor stub  
  23.     }  
  24.   
  25.     /* (non-Javadoc) 
  26.      * @see android.widget.SimpleAdapter#getView(int, android.view.View, android.view.ViewGroup) 
  27.      */  
  28.     @Override  
  29.     public View getView(int position, View convertView, ViewGroup parent) {  
  30.         // TODO Auto-generated method stub  
  31.         View view= super.getView(position, convertView, parent);  
  32.            ImageButton btn=(ImageButton) view.findViewById(R.id.imageButton);  
  33.            btn.setTag(position);  
  34.            btn.setOnClickListener(new OnClickListener() {  
  35.               
  36.             @Override  
  37.             public void onClick(View v) {  
  38.              // TODO Auto-generated method stub  
  39.              Toast.makeText(getApplicationContext(), "点击的是ImageButton"+v.getTag(), 1).show();  
  40.             }  
  41.            });  
  42.            return view;  
  43.     }  
  44.   
  45.     protected Context getApplicationContext() {  
  46.         // TODO Auto-generated method stub  
  47.         return context;  
  48.     }  
  49.   
  50.       
  51. }  
         activity_main.xml
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context="com.example.arrayadapter.MainActivity" >  
  10.   
  11.     <!-- 点击ListView item空白地方没响应的原因:ListView的layout_width设置为“wrap_content”,应该为fill_parent或match_parent -->  
  12.     <ListView    
  13.         android:id="@+id/listview"    
  14.         android:layout_width="match_parent"    
  15.         android:layout_height="fill_parent" >    
  16.     </ListView>    
  17.   
  18. </LinearLayout>  
         item.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:descendantFocusability="blocksDescendants"  
  6.     android:orientation="horizontal" >  
  7.   
  8.     <ImageView  
  9.         android:id="@+id/img"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:src="@drawable/ic_launcher" />  
  13.   
  14.     <LinearLayout  
  15.         android:layout_width="174dp"  
  16.         android:layout_height="wrap_content"  
  17.         android:layout_weight="1"  
  18.         android:orientation="vertical" >  
  19.   
  20.         <TextView  
  21.             android:id="@+id/view1"  
  22.             android:layout_width="match_parent"  
  23.             android:layout_height="wrap_content"  
  24.             android:text="view1" />  
  25.   
  26.         <TextView  
  27.             android:id="@+id/view2"  
  28.             android:layout_width="match_parent"  
  29.             android:layout_height="wrap_content"  
  30.             android:text="view2" />  
  31.     </LinearLayout>  
  32.   
  33.     <ImageButton  
  34.         android:id="@+id/imageButton"  
  35.         android:layout_width="wrap_content"  
  36.         android:layout_height="wrap_content"  
  37.         android:clickable="true"  
  38.         android:focusable="false"  
  39.         android:gravity="right"  
  40.         android:src="@drawable/ic_launcher" />  
  41.   
  42. </LinearLayout>  


(2)使用baseAdapter为listView的item添加按钮响应事件

        MainActivity.java

  1.  package com.example.listviewdemo;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10. import android.view.Menu;  
  11. import android.view.MenuItem;  
  12. import android.view.View;  
  13. import android.widget.AdapterView;  
  14. import android.widget.ArrayAdapter;  
  15. import android.widget.ListView;  
  16. import android.widget.Toast;  
  17. import android.widget.AdapterView.OnItemClickListener;  
  18.   
  19.   
  20. /** 
  21.  * @author Devel_000 
  22.  *使用baseAdapter为listView的item添加按钮响应事件 
  23.  */  
  24. public class MainActivity extends Activity {  
  25.   
  26.     private ListView lv ;       //声明一个列表  
  27.     ArrayList<Map<String,Object>> listData ;  
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.activity_main);  
  32.         lv = (ListView)findViewById(R.id.listview) ;  
  33.         listData = getData() ;  
  34.         MyAdapter myAdapter = new MyAdapter(this,listData) ;  
  35.         lv.setAdapter(myAdapter) ;  
  36.           
  37.       //添加监听器  
  38.         lv.setOnItemClickListener(new OnItemClickListener(){  
  39.   
  40.             @Override  
  41.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
  42.                     long arg3) {  
  43.                 // TODO Auto-generated method stub  
  44.                 Toast.makeText(MainActivity.this"点击的是ListView的item:"+arg2, Toast.LENGTH_LONG).show() ;  
  45.             }  
  46.               
  47.         }) ;  
  48.     }  
  49.   
  50.   
  51.     //Item的内容  
  52.     private ArrayList<Map<String,Object>> getData()  
  53.     {  
  54.         ArrayList<Map<String,Object>> data = new ArrayList<Map<String,Object>>() ;  
  55.         Map<String,Object> item ;  
  56.         item = new HashMap<String,Object>() ;  
  57.         item.put("view1""张三") ;  
  58.         item.put("view2""23") ;  
  59.         item.put("img", R.drawable.ic_launcher) ;  
  60.         item.put("imageButton", R.drawable.ic_launcher) ;  
  61.         data.add(item) ;  
  62.         item = new HashMap<String,Object>() ;  
  63.         item.put("view1""李四") ;  
  64.         item.put("view2""20") ;  
  65.         item.put("img", R.drawable.ic_launcher) ;  
  66.         item.put("imageButton", R.drawable.ic_launcher) ;  
  67.         data.add(item) ;  
  68.         return data ;  
  69.     }  
  70.       
  71.     @Override  
  72.     public boolean onCreateOptionsMenu(Menu menu) {  
  73.         // Inflate the menu; this adds items to the action bar if it is present.  
  74.         getMenuInflater().inflate(R.menu.main, menu);  
  75.         return true;  
  76.     }  
  77.   
  78.     @Override  
  79.     public boolean onOptionsItemSelected(MenuItem item) {  
  80.         // Handle action bar item clicks here. The action bar will  
  81.         // automatically handle clicks on the Home/Up button, so long  
  82.         // as you specify a parent activity in AndroidManifest.xml.  
  83.         int id = item.getItemId();  
  84.         if (id == R.id.action_settings) {  
  85.             return true;  
  86.         }  
  87.         return super.onOptionsItemSelected(item);  
  88.     }  
  89. }  
     MyAdapter.java
  1. package com.example.listviewdemo;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Map;  
  5.   
  6. import android.content.Context;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.view.ViewGroup;  
  11. import android.widget.BaseAdapter;  
  12. import android.widget.ImageButton;  
  13. import android.widget.ImageView;  
  14. import android.widget.TextView;  
  15. import android.widget.Toast;  
  16.   
  17. public class MyAdapter extends BaseAdapter {  
  18.   
  19.     private LayoutInflater mInflater ;  
  20.     private ArrayList<Map<String,Object>> listData ;  
  21.     private Context context ;  
  22.     public MyAdapter(Context context,ArrayList<Map<String,Object>> listData)  
  23.     {  
  24.         mInflater = LayoutInflater.from(context) ;  
  25.         this.listData = listData ;  
  26.         this.context = context ;  
  27.     }  
  28.     @Override  
  29.     public int getCount() {  
  30.         // TODO Auto-generated method stub  
  31.         return listData.size() ;  
  32.     }  
  33.   
  34.     @Override  
  35.     public Object getItem(int arg0) {  
  36.         // TODO Auto-generated method stub  
  37.         return null;  
  38.     }  
  39.   
  40.     @Override  
  41.     public long getItemId(int arg0) {  
  42.         // TODO Auto-generated method stub  
  43.         return 0;  
  44.     }  
  45.   
  46.     //这里arg0被定义为final是java语法规范(Cannot refer to a non-final variable arg0 inside an inner class defined in a different method)  
  47.     @Override  
  48.     public View getView(final int arg0, View arg1, ViewGroup arg2) {  
  49.         // TODO Auto-generated method stub  
  50.         ViewHolder holder = null ;  
  51.         if(arg1 == null)  
  52.         {  
  53.             holder = new ViewHolder() ;  
  54.             arg1 = mInflater.inflate(R.layout.item, null);  
  55.             //需要为每个控件指定内容,如指定textView的显示文字(这就是引用的listData作用)  
  56.             holder.imageButton = (ImageButton)arg1.findViewById(R.id.imageButton) ;  
  57.             holder.imageView = (ImageView)arg1.findViewById(R.id.img) ;  
  58.             holder.textView1 = (TextView)arg1.findViewById(R.id.view1) ;  
  59.             holder.textView1.setText(listData.get(arg0).get("view1").toString()) ;  
  60.             holder.textView2 = (TextView)arg1.findViewById(R.id.view2) ;  
  61.             holder.textView2.setText(listData.get(arg0).get("view2").toString()) ;  
  62.             arg1.setTag(holder) ;  
  63.         }  
  64.         else  
  65.         {  
  66.             holder = (ViewHolder)arg1.getTag();  
  67.         }  
  68.           
  69.         holder.imageButton.setOnClickListener(new OnClickListener(){    
  70.                 
  71.             @Override    
  72.             public void onClick(View v) {    
  73.                 // TODO Auto-generated method stub    
  74.                  Toast.makeText(getApplicationContext(), "点击的是ImageButton "+arg0, 1).show();  
  75.             }});  
  76.         return arg1;  
  77.     }  
  78.   
  79.     protected Context getApplicationContext() {  
  80.         // TODO Auto-generated method stub  
  81.         return context;  
  82.     }  
  83.   
  84.     public class ViewHolder  
  85.     {  
  86.         public ImageView imageView ;  
  87.         public TextView textView1 ;  
  88.         public TextView textView2 ;  
  89.         public ImageButton imageButton ;  
  90.     }  
  91. }  
        activity_main.xml
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context="com.example.arrayadapter.MainActivity" >  
  10.   
  11.     <!-- 点击ListView item空白地方没响应的原因:ListView的layout_width设置为“wrap_content”,应该为fill_parent或match_parent -->  
  12.     <ListView    
  13.         android:id="@+id/listview"    
  14.         android:layout_width="match_parent"    
  15.         android:layout_height="fill_parent" >    
  16.     </ListView>    
  17.   
  18. </LinearLayout>  
        item.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:descendantFocusability="blocksDescendants"  
  6.     android:orientation="horizontal" >  
  7.   
  8.     <ImageView  
  9.         android:id="@+id/img"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:src="@drawable/ic_launcher" />  
  13.   
  14.     <LinearLayout  
  15.         android:layout_width="174dp"  
  16.         android:layout_height="wrap_content"  
  17.         android:layout_weight="1"  
  18.         android:orientation="vertical" >  
  19.   
  20.         <TextView  
  21.             android:id="@+id/view1"  
  22.             android:layout_width="match_parent"  
  23.             android:layout_height="wrap_content"  
  24.             android:text="view1" />  
  25.   
  26.         <TextView  
  27.             android:id="@+id/view2"  
  28.             android:layout_width="match_parent"  
  29.             android:layout_height="wrap_content"  
  30.             android:text="view2" />  
  31.     </LinearLayout>  
  32.   
  33.     <ImageButton  
  34.         android:id="@+id/imageButton"  
  35.         android:layout_width="wrap_content"  
  36.         android:layout_height="wrap_content"  
  37.         android:clickable="true"  
  38.         android:focusable="false"  
  39.         android:gravity="right"  
  40.         android:src="@drawable/ic_launcher" />  
  41.   
  42. </LinearLayout>  

运行截图:


在此过程中可能会遇到的问题(上述代码是可正常运行的,没有问题的):

1.为listView添加button等控件时,点击item没响应:

解决方法:在ListView的Item的xml文件中添加如下属性:

                1)整个xml文件的根元素如LinearLayout中添加属性Android:descendantFocusability="blocksDescendants"

                2)被点击的控件如ImageButton中添加属性android:focusable="false"和android:clickable="true"

2.点击listView item中的空白地方没响应:

解决方法:在含ListView的布局中将listView的layout_width设置为fill_parent或match_parent,而不是“wrap_content”

仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值