原文网址:http://blog.csdn.net/qq435757399/article/details/8256453

1.先看下效果图:

      

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

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

  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. holder=new ViewHolder();
  7. //可以理解为从vlist获取view  之后把view返回给ListView
  8. convertView = mInflater.inflate(R.layout.vlist, null);
  9. holder.title = (TextView)convertView.findViewById(R.id.title);
  10. holder.info = (TextView)convertView.findViewById(R.id.info);
  11. holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
  12. convertView.setTag(holder);
  13. }else {
  14. holder = (ViewHolder)convertView.getTag();
  15. }
  16. holder.title.setText((String)mData.get(position).get("title"));
  17. holder.info.setText((String)mData.get(position).get("info"));
  18. holder.viewBtn.setTag(position);
  19. //给Button添加单击事件  添加Button之后ListView将失去焦点  需要的直接把Button的焦点去掉
  20. holder.viewBtn.setOnClickListener(new View.OnClickListener() {
  21. @Override
  22. public void onClick(View v) {
  23. showInfo(position);
  24. }
  25. });
  26. //holder.viewBtn.setOnClickListener(MyListener(position));
  27. return convertView;
  28. }
  29. }
  30. //提取出来方便点
  31. public final class ViewHolder {
  32. public TextView title;
  33. public TextView info;
  34. public Button viewBtn;
  35. }
  36. public void showInfo(int position){
  37. ImageView img=new ImageView(ListViewActivity.this);
  38. img.setImageResource(R.drawable.b);
  39. new AlertDialog.Builder(this).setView(img)
  40. .setTitle("详情"+position)
  41. .setMessage("菜名:"+title[position]+"   价格:"+info[position])
  42. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  43. @Override
  44. public void onClick(DialogInterface dialog, int which) {
  45. }
  46. })
  47. .show();
  48. }

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

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

3.全部代码

1.ListViewActivity.java全部代码:

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

2.main.xml

  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. <ListView
  7. android:id="@+id/listView"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:divider="@drawable/list_line"
  11. android:dividerHeight="1dip" />
  12. </LinearLayout>

3.vlist.xml

  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. <ListView
  7. android:id="@+id/listView"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:divider="@drawable/list_line"
  11. android:dividerHeight="1dip" />
  12. </LinearLayout>

4.btn_detail_selecter.xml

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

5.item.xml

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

6.colors.xml

  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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string name="hello">Hello World, ListViewActivity!</string>
  4. <string name="app_name">ListView</string>
  5. </resources>

8.drawables.xml

  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>

需要源码的请到github  clone,方便的话Follow一下哈: https://github.com/Juneor/ListViewButtonListener

【转】为ListView每个Item上面的按钮添加事件的更多相关文章

  1. Unity3D的按钮添加事件有三种方式

    为Unity3D的按钮添加事件有三种方式,假设我们场景中有一个Canvas对象,Canvas对象中有一个Button对象. 方式一: 创建脚本ClickObject.cs,然后将脚本添加到Canvas ...

  2. GUI编程笔记(java)06:GUI窗体添加按钮并对按钮添加事件案例

    1.需求:把按钮添加到窗体,并对按钮添加一个点击事件. 步骤: (1)创建窗体对象(2)创建按钮对象(3)把按钮添加到窗体(4)窗体显示 2.编写程序思路: 窗体布局:窗体中组件的排列方式  布局分类 ...

  3. 自定义的UITabbar上面的按钮的x坐标的计算方法

    ; i < 4; i++) {//4是按钮的个数 NSString *backImage = backgroud[i]; NSString *heightImage = heightBackgr ...

  4. 用于阻止div上的事件和div上的按钮的事件同时触发

    event.stopPropagation()  阻止事件冒泡  用于ie11以上

  5. 一百、SAP中ALV事件之十三,给ALV的自定义按钮添加事件

    一.我们查看定义的按钮,有一个名字是ZADD的自定义按钮 二.代码如下,用于判断点击了哪个按钮 三.点击测试按钮之后,会弹出一个弹窗 完美

  6. JS闭包导致循环给按钮添加事件时总是执行最后一个

    加入如下脚本代码: <script> var list_obj = document.getElementsByTagName('li'); for (var i = 0; i <= ...

  7. bootstraptable为行中的按钮添加事件

  8. Plupload 上传详细讲解,Plupload 多实例上传,Plupload多个上传按钮--推荐使用

    今天帮朋友解决  Plupload  上传的问题,查了很多资料,资料还是挺全的,但是有点零零散散的,故整理好,合并发出来. 本教程包括: Plupload  上传详细讲. Plupload  多实例上 ...

  9. ListView的Item被点击和其中的Button被点击同时生效

    Android开发中在ListView中经常有Button或ImageButton等需要被点击的控件,如果不加一些特殊的限制,有可能 ListView的Item的点击事件或Button的点击事件,其中 ...

随机推荐

  1. uiscrollview上的 uipangesturerecognizer冲突

    最近在tableview里的cell imageview加了个 uipangesturerecognizer发现优先滚动imageview,往上拖的时候,tableView不响应滚动了,原来是tabl ...

  2. [转]SQL语句:Group By总结

    1. Group By 语句简介: Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若 ...

  3. 当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand问题解决

    1.目前看主要因为两种,第一种是select语句没有包含主键列,select *  就可以解决.或 select 主键列 这里的主键是指的primary key而不是unique key 2.最重要的 ...

  4. 你喜欢使用eclipse+tomcat编程吗?!

    在eclipse中配置tomcat简直是一场灾难! 开源软件确实给开发者极大的自由,但,同时也带来额外的麻烦. eclipse+tomcat只是其中之一.我有幸碰到了N次,在N+1次时,不得不提笔撰文 ...

  5. Mysql备份数据库的一种方法

    今天添加了一个数据库自动备份的模块,mysql数据备份的方法有很多,可以对单个数据库备份,可以多个数据库备份,也可以对某一个表进行备份,可以只备份数据库的结构不备份数据,可以根据需要做不同处理,正好现 ...

  6. e+开发中的各种问题

    1.数据交换后走的查询公式还是controller所配置的公式

  7. notepad++插件使用说明

    在进行渗透测试的过程中,经常需要分析一些js或xml文件,或者是一些url,它们多是经过压缩或编码的,看起来不方便.这里介绍几款常用的notepad++插件,会极大的方便我们的开发测试. 1 Xml ...

  8. .net ajax式上传文件

    今天在这里介绍一下ajax上传文件.其实也不算是真的使用xmlhttprequest上传,只是使用了iframe实现了无刷新上传而已,最多也只算 是仿ajax上传文件.然而网上关于使用xmlhttpr ...

  9. ruby环境sass编译中文出现Syntax error: Invalid GBK character错误解决方法

    sass文件编译时候使用ruby环境,无论是界面化的koala工具还是命令行模式的都无法通过,真是令人烦恼. 容易出现中文注释时候无法编译通过,或者出现乱码,找了几天的解决方法终于解决了. 这个问题的 ...

  10. linux下进度条的简单实现

    在实现进度条之前,先学习一下makefile. 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中, makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编 ...