为ListView每个Item上面的按钮添加事件

2024-06-18 01:58

本文主要是介绍为ListView每个Item上面的按钮添加事件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址 :



1.先看下效果图:

      

在这里仅供测试,我把数据都写死了,根据需要可以自己进行修改,此外实现ListView上面每个Item上的Button的事件有两种方法:

1.使用final变量扩展局部变量的生命周期范围主要代码(本文最后附全部代码):

[java]  view plain copy
  1. //注意原本getView方法中的int position变量是非final的,现在改为final  
  2.         @Override  
  3.         public View getView(final int position, View convertView, ViewGroup parent) {  
  4.              ViewHolder holder = null;  
  5.             if (convertView == null) {  
  6.                   
  7.                 holder=new ViewHolder();    
  8.                   
  9.                 //可以理解为从vlist获取view  之后把view返回给ListView  
  10.                 convertView = mInflater.inflate(R.layout.vlist, null);  
  11.                 holder.title = (TextView)convertView.findViewById(R.id.title);  
  12.                 holder.info = (TextView)convertView.findViewById(R.id.info);  
  13.                 holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);  
  14.                 convertView.setTag(holder);               
  15.             }else {               
  16.                 holder = (ViewHolder)convertView.getTag();  
  17.             }         
  18.               
  19.             holder.title.setText((String)mData.get(position).get("title"));  
  20.             holder.info.setText((String)mData.get(position).get("info"));  
  21.             holder.viewBtn.setTag(position);  
  22.             //给Button添加单击事件  添加Button之后ListView将失去焦点  需要的直接把Button的焦点去掉  
  23.             holder.viewBtn.setOnClickListener(new View.OnClickListener() {  
  24.                   
  25.                 @Override  
  26.                 public void onClick(View v) {  
  27.                     showInfo(position);                   
  28.                 }  
  29.             });  
  30.               
  31.             //holder.viewBtn.setOnClickListener(MyListener(position));  
  32.                       
  33.             return convertView;  
  34.         }  
  35.     }  
  36.       
  37.     //提取出来方便点  
  38.     public final class ViewHolder {  
  39.         public TextView title;  
  40.         public TextView info;  
  41.         public Button viewBtn;  
  42.     }  
  43.     public void showInfo(int position){  
  44.           
  45.         ImageView img=new ImageView(ListViewActivity.this);  
  46.         img.setImageResource(R.drawable.b);  
  47.         new AlertDialog.Builder(this).setView(img)  
  48.         .setTitle("详情"+position)  
  49.         .setMessage("菜名:"+title[position]+"   价格:"+info[position])  
  50.         .setPositiveButton("确定"new DialogInterface.OnClickListener() {  
  51.             @Override  
  52.             public void onClick(DialogInterface dialog, int which) {  
  53.             }  
  54.         })  
  55.         .show();  
  56.     }  
  57.       







2.使用类记录每个Button的位置,使每个BUTTON都有自己的Listener主要代码:



[java]  view plain copy
  1. //****************************************第二种方法,高手一般都用此种方法,具体原因,我还不清楚,有待研究  
  2.       
  3.         public View getView(int position, View convertView, ViewGroup parent) {  
  4.              ViewHolder holder = null;  
  5.              MyListener myListener=null;  
  6.             if (convertView == null) {  
  7.                   
  8.                 holder=new ViewHolder();    
  9.                   
  10.                 //可以理解为从vlist获取view  之后把view返回给ListView  
  11.                  myListener=new MyListener(position);  
  12.                      
  13.                 convertView = mInflater.inflate(R.layout.vlist, null);  
  14.                 holder.title = (TextView)convertView.findViewById(R.id.title);  
  15.                 holder.info = (TextView)convertView.findViewById(R.id.info);  
  16.                 holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);  
  17.                 convertView.setTag(holder);               
  18.             }else {               
  19.                 holder = (ViewHolder)convertView.getTag();  
  20.             }         
  21.               
  22.             holder.title.setText((String)mData.get(position).get("title"));  
  23.             holder.info.setText((String)mData.get(position).get("info"));  
  24.             holder.viewBtn.setTag(position);  
  25.             //给Button添加单击事件  添加Button之后ListView将失去焦点  需要的直接把Button的焦点去掉  
  26.             holder.viewBtn.setOnClickListener( myListener);  
  27.               
  28.             //holder.viewBtn.setOnClickListener(MyListener(position));  
  29.                       
  30.             return convertView;  
  31.         }  
  32.     }  
  33.       
  34.      private class MyListener implements OnClickListener{  
  35.             int mPosition;  
  36.             public MyListener(int inPosition){  
  37.                 mPosition= inPosition;  
  38.             }  
  39.             @Override  
  40.             public void onClick(View v) {  
  41.                 // TODO Auto-generated method stub  
  42.                 Toast.makeText(ListViewActivity.this, title[mPosition], Toast.LENGTH_SHORT).show();  
  43.             }  
  44.               
  45.         }  
  46.   
  47.       
  48.       
  49.       
  50.       
  51.       
  52.       
  53.       
  54.       
  55.       
  56.     //提取出来方便点  
  57.     public final class ViewHolder {  
  58.         public TextView title;  
  59.         public TextView info;  
  60.         public Button viewBtn;  
  61.     }  



3.全部代码

1.ListViewActivity.java全部代码:

[java]  view plain copy
  1. package ms.ListView;  
  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.app.AlertDialog;  
  10. import android.content.Context;  
  11. import android.content.DialogInterface;  
  12. import android.os.Bundle;  
  13. import android.view.LayoutInflater;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.view.ViewGroup;  
  17. import android.widget.AdapterView;  
  18. import android.widget.AdapterView.OnItemSelectedListener;  
  19. import android.widget.BaseAdapter;  
  20. import android.widget.Button;  
  21. import android.widget.ImageView;  
  22. import android.widget.ListView;  
  23. import android.widget.TextView;  
  24. import android.widget.Toast;  
  25.   
  26. public class ListViewActivity extends Activity {  
  27.     /** Called when the activity is first created. */  
  28.     private List<Map<String, Object>> mData;  
  29.     private int flag;  
  30.     public static String title[]=new String[]{"菜名0","菜名1","菜名2","菜名3","菜名4","菜名5","菜名6","菜名7","菜名8","菜名9"};  
  31.     public static String info[]=new String[]{ "¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28",};  
  32.       
  33.   
  34.     @Override  
  35.     public void onCreate(Bundle savedInstanceState) {  
  36.         super.onCreate(savedInstanceState);  
  37.         setContentView(R.layout.main);  
  38.         mData = getData();  
  39.         ListView listView = (ListView) findViewById(R.id.listView);  
  40.         MyAdapter adapter = new MyAdapter(this);  
  41.         listView.setAdapter(adapter);  
  42.           
  43.           
  44.     }  
  45.   
  46.   
  47.   
  48.     //获取动态数组数据  可以由其他地方传来(json等)  
  49.     private List<Map<String, Object>> getData() {  
  50.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
  51. for(int i=0;i<title.length;i++){  
  52.         Map<String, Object> map = new HashMap<String, Object>();  
  53.         map.put("title", title[i]);  
  54.         map.put("info", info[i]);  
  55.         list.add(map);  
  56. }  
  57.   
  58.         return list;  
  59.     }  
  60.   
  61.     public class MyAdapter extends BaseAdapter {  
  62.   
  63.         private LayoutInflater mInflater;  
  64.   
  65.         public MyAdapter(Context context) {  
  66.             this.mInflater = LayoutInflater.from(context);  
  67.         }  
  68.   
  69.         @Override  
  70.         public int getCount() {  
  71.             // TODO Auto-generated method stub  
  72.             return mData.size();  
  73.         }  
  74.   
  75.         @Override  
  76.         public Object getItem(int position) {  
  77.             // TODO Auto-generated method stub  
  78.             return null;  
  79.         }  
  80.   
  81.         @Override  
  82.         public long getItemId(int position) {  
  83.             // TODO Auto-generated method stub  
  84.             return 0;  
  85.         }  
  86.         //****************************************final方法  
  87. //注意原本getView方法中的int position变量是非final的,现在改为final  
  88.         @Override  
  89.         public View getView(final int position, View convertView, ViewGroup parent) {  
  90.              ViewHolder holder = null;  
  91.             if (convertView == null) {  
  92.                   
  93.                 holder=new ViewHolder();    
  94.                   
  95.                 //可以理解为从vlist获取view  之后把view返回给ListView  
  96.                   
  97.                 convertView = mInflater.inflate(R.layout.vlist, null);  
  98.                 holder.title = (TextView)convertView.findViewById(R.id.title);  
  99.                 holder.info = (TextView)convertView.findViewById(R.id.info);  
  100.                 holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);  
  101.                 convertView.setTag(holder);               
  102.             }else {               
  103.                 holder = (ViewHolder)convertView.getTag();  
  104.             }         
  105.               
  106.             holder.title.setText((String)mData.get(position).get("title"));  
  107.             holder.info.setText((String)mData.get(position).get("info"));  
  108.             holder.viewBtn.setTag(position);  
  109.             //给Button添加单击事件  添加Button之后ListView将失去焦点  需要的直接把Button的焦点去掉  
  110.             holder.viewBtn.setOnClickListener(new View.OnClickListener() {  
  111.                   
  112.                 @Override  
  113.                 public void onClick(View v) {  
  114.                     showInfo(position);                   
  115.                 }  
  116.             });  
  117.               
  118.             //holder.viewBtn.setOnClickListener(MyListener(position));  
  119.                       
  120.             return convertView;  
  121.         }  
  122.     }  
  123.         //****************************************第二种方法,高手一般都用此种方法,具体原因,我还不清楚,有待研究  
  124.       
  125. //      public View getView(int position, View convertView, ViewGroup parent) {  
  126. //           ViewHolder holder = null;  
  127. //           MyListener myListener=null;  
  128. //          if (convertView == null) {  
  129. //                
  130. //              holder=new ViewHolder();    
  131. //                
  132. //              //可以理解为从vlist获取view  之后把view返回给ListView  
  133. //               myListener=new MyListener(position);  
  134. //                   
  135. //              convertView = mInflater.inflate(R.layout.vlist, null);  
  136. //              holder.title = (TextView)convertView.findViewById(R.id.title);  
  137. //              holder.info = (TextView)convertView.findViewById(R.id.info);  
  138. //              holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);  
  139. //              convertView.setTag(holder);               
  140. //          }else {               
  141. //              holder = (ViewHolder)convertView.getTag();  
  142. //          }         
  143. //            
  144. //          holder.title.setText((String)mData.get(position).get("title"));  
  145. //          holder.info.setText((String)mData.get(position).get("info"));  
  146. //          holder.viewBtn.setTag(position);  
  147. //          //给Button添加单击事件  添加Button之后ListView将失去焦点  需要的直接把Button的焦点去掉  
  148. //          holder.viewBtn.setOnClickListener( myListener);  
  149. //            
  150. //          //holder.viewBtn.setOnClickListener(MyListener(position));  
  151. //                    
  152. //          return convertView;  
  153. //      }  
  154. //  }  
  155. //    
  156. //   private class MyListener implements OnClickListener{  
  157. //          int mPosition;  
  158. //          public MyListener(int inPosition){  
  159. //              mPosition= inPosition;  
  160. //          }  
  161. //          @Override  
  162. //          public void onClick(View v) {  
  163. //              // TODO Auto-generated method stub  
  164. //              Toast.makeText(ListViewActivity.this, title[mPosition], Toast.LENGTH_SHORT).show();  
  165. //          }  
  166. //            
  167. //      }  
  168. //  
  169. //    
  170.       
  171.       
  172.       
  173.       
  174.       
  175.       
  176.       
  177.       
  178.     //提取出来方便点  
  179.     public final class ViewHolder {  
  180.         public TextView title;  
  181.         public TextView info;  
  182.         public Button viewBtn;  
  183.     }  
  184.     public void showInfo(int position){  
  185.           
  186.         ImageView img=new ImageView(ListViewActivity.this);  
  187.         img.setImageResource(R.drawable.b);  
  188.         new AlertDialog.Builder(this).setView(img)  
  189.         .setTitle("详情"+position)  
  190.         .setMessage("菜名:"+title[position]+"   价格:"+info[position])  
  191.         .setPositiveButton("确定"new DialogInterface.OnClickListener() {  
  192.             @Override  
  193.             public void onClick(DialogInterface dialog, int which) {  
  194.             }  
  195.         })  
  196.         .show();  
  197.     }  
  198.       
  199.       
  200. }  

2.main.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <ListView   
  8.         android:id="@+id/listView"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent"  
  11.         android:divider="@drawable/list_line"  
  12.         android:dividerHeight="1dip" />  
  13.   
  14. </LinearLayout>  

3.vlist.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <ListView   
  8.         android:id="@+id/listView"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent"  
  11.         android:divider="@drawable/list_line"  
  12.         android:dividerHeight="1dip" />  
  13.   
  14. </LinearLayout>  

4.btn_detail_selecter.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   
  4.     <item android:drawable="@drawable/btn_detail_normal" android:state_enabled="true" android:state_focused="false" android:state_pressed="false"/>  
  5.     <item android:drawable="@drawable/btn_detail_pressed" android:state_enabled="true" android:state_pressed="true"/>  
  6.     <item android:drawable="@drawable/btn_detail_pressed" android:state_enabled="true" android:state_focused="true"/>  
  7.   
  8. </selector>  

5.item.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   
  4.     <item android:drawable="@drawable/item_higlight" android:state_focused="true" android:state_pressed="false"/>  
  5.     <item android:drawable="@drawable/item_higlight" android:state_focused="false" android:state_pressed="true"/>  
  6.     <item android:drawable="@drawable/item_higlight" android:state_selected="true"/>  
  7.     <item android:drawable="@drawable/item_higlight" android:state_focused="true"/>  
  8.     <item android:drawable="@drawable/item_higlight"/>  
  9.   
  10. </selector>  


6.colors.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <resources>  
  3.     <color name="region">#8000ff00</color>  
  4.     <color name="listTitle">#ff23323b</color>  
  5.     <color name="text">#ff848f9b</color>  
  6.     <color name="write">#ffffffff</color>  
  7. </resources>  

7.values.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.   
  4.     <string name="hello">Hello World, ListViewActivity!</string>  
  5.     <string name="app_name">ListView</string>  
  6.   
  7. </resources>  

8.drawables.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <resources>  
  3.     <item type="drawable" name="bg">#80000000</item>  
  4.     <item type="drawable" name="transparent">#00000000</item>  
  5.     <item type="drawable" name="lightblue">#ffcfe1ed</item>  
  6.     <item type="drawable" name="readmenu_btn_bg_f">#30ffffff</item>  
  7.     <item type="drawable" name="readmenu_btn_bg_p">#50ffffff</item>  
  8.     <item type="drawable" name="blackMask">#30000000</item>  
  9. </resources>  

这篇关于为ListView每个Item上面的按钮添加事件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070988

相关文章

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

【经验交流】修复系统事件查看器启动不能时出现的4201错误

方法1,取得『%SystemRoot%\LogFiles』文件夹和『%SystemRoot%\System32\wbem』文件夹的权限(包括这两个文件夹的所有子文件夹的权限),简单点说,就是使你当前的帐户拥有这两个文件夹以及它们的子文件夹的绝对控制权限。这是最简单的方法,不少老外说,这样一弄,倒是解决了问题。不过对我的系统,没用; 方法2,以不带网络的安全模式启动,运行命令行,输入“ne

BT天堂网站挂马事件后续:“大灰狼”远控木马分析及幕后真凶调查

9月初安全团队披露bt天堂网站挂马事件,该网站被利用IE神洞CVE-2014-6332挂马,如果用户没有打补丁或开启安全软件防护,电脑会自动下载执行大灰狼远控木马程序。 鉴于bt天堂电影下载网站访问量巨大,此次挂马事件受害者甚众,安全团队专门针对该木马进行严密监控,并对其幕后真凶进行了深入调查。 一、“大灰狼”的伪装 以下是10月30日一天内大灰狼远控的木马样本截图,可以看到该木马变种数量不