【转】为ListView每个Item上面的按钮添加事件
原文网址:http://blog.csdn.net/qq435757399/article/details/8256453
1.先看下效果图:
在这里仅供测试,我把数据都写死了,根据需要可以自己进行修改,此外实现ListView上面每个Item上的Button的事件有两种方法:
1.使用final变量扩展局部变量的生命周期范围主要代码(本文最后附全部代码):
- //注意原本getView方法中的int position变量是非final的,现在改为final
- @Override
- public View getView(final int position, View convertView, ViewGroup parent) {
- ViewHolder holder = null;
- if (convertView == null) {
- holder=new ViewHolder();
- //可以理解为从vlist获取view 之后把view返回给ListView
- convertView = mInflater.inflate(R.layout.vlist, null);
- holder.title = (TextView)convertView.findViewById(R.id.title);
- holder.info = (TextView)convertView.findViewById(R.id.info);
- holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
- convertView.setTag(holder);
- }else {
- holder = (ViewHolder)convertView.getTag();
- }
- holder.title.setText((String)mData.get(position).get("title"));
- holder.info.setText((String)mData.get(position).get("info"));
- holder.viewBtn.setTag(position);
- //给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉
- holder.viewBtn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- showInfo(position);
- }
- });
- //holder.viewBtn.setOnClickListener(MyListener(position));
- return convertView;
- }
- }
- //提取出来方便点
- public final class ViewHolder {
- public TextView title;
- public TextView info;
- public Button viewBtn;
- }
- public void showInfo(int position){
- ImageView img=new ImageView(ListViewActivity.this);
- img.setImageResource(R.drawable.b);
- new AlertDialog.Builder(this).setView(img)
- .setTitle("详情"+position)
- .setMessage("菜名:"+title[position]+" 价格:"+info[position])
- .setPositiveButton("确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- }
- })
- .show();
- }
2.使用类记录每个Button的位置,使每个BUTTON都有自己的Listener主要代码:
- //****************************************第二种方法,高手一般都用此种方法,具体原因,我还不清楚,有待研究
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder = null;
- MyListener myListener=null;
- if (convertView == null) {
- holder=new ViewHolder();
- //可以理解为从vlist获取view 之后把view返回给ListView
- myListener=new MyListener(position);
- convertView = mInflater.inflate(R.layout.vlist, null);
- holder.title = (TextView)convertView.findViewById(R.id.title);
- holder.info = (TextView)convertView.findViewById(R.id.info);
- holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
- convertView.setTag(holder);
- }else {
- holder = (ViewHolder)convertView.getTag();
- }
- holder.title.setText((String)mData.get(position).get("title"));
- holder.info.setText((String)mData.get(position).get("info"));
- holder.viewBtn.setTag(position);
- //给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉
- holder.viewBtn.setOnClickListener( myListener);
- //holder.viewBtn.setOnClickListener(MyListener(position));
- return convertView;
- }
- }
- private class MyListener implements OnClickListener{
- int mPosition;
- public MyListener(int inPosition){
- mPosition= inPosition;
- }
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Toast.makeText(ListViewActivity.this, title[mPosition], Toast.LENGTH_SHORT).show();
- }
- }
- //提取出来方便点
- public final class ViewHolder {
- public TextView title;
- public TextView info;
- public Button viewBtn;
- }
3.全部代码
1.ListViewActivity.java全部代码:
- package ms.ListView;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemSelectedListener;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.Toast;
- public class ListViewActivity extends Activity {
- /** Called when the activity is first created. */
- private List<Map<String, Object>> mData;
- private int flag;
- public static String title[]=new String[]{"菜名0","菜名1","菜名2","菜名3","菜名4","菜名5","菜名6","菜名7","菜名8","菜名9"};
- public static String info[]=new String[]{ "¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28","¥:28",};
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mData = getData();
- ListView listView = (ListView) findViewById(R.id.listView);
- MyAdapter adapter = new MyAdapter(this);
- listView.setAdapter(adapter);
- }
- //获取动态数组数据 可以由其他地方传来(json等)
- private List<Map<String, Object>> getData() {
- List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
- for(int i=0;i<title.length;i++){
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("title", title[i]);
- map.put("info", info[i]);
- list.add(map);
- }
- return list;
- }
- public class MyAdapter extends BaseAdapter {
- private LayoutInflater mInflater;
- public MyAdapter(Context context) {
- this.mInflater = LayoutInflater.from(context);
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return mData.size();
- }
- @Override
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return 0;
- }
- //****************************************final方法
- //注意原本getView方法中的int position变量是非final的,现在改为final
- @Override
- public View getView(final int position, View convertView, ViewGroup parent) {
- ViewHolder holder = null;
- if (convertView == null) {
- holder=new ViewHolder();
- //可以理解为从vlist获取view 之后把view返回给ListView
- convertView = mInflater.inflate(R.layout.vlist, null);
- holder.title = (TextView)convertView.findViewById(R.id.title);
- holder.info = (TextView)convertView.findViewById(R.id.info);
- holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
- convertView.setTag(holder);
- }else {
- holder = (ViewHolder)convertView.getTag();
- }
- holder.title.setText((String)mData.get(position).get("title"));
- holder.info.setText((String)mData.get(position).get("info"));
- holder.viewBtn.setTag(position);
- //给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉
- holder.viewBtn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- showInfo(position);
- }
- });
- //holder.viewBtn.setOnClickListener(MyListener(position));
- return convertView;
- }
- }
- //****************************************第二种方法,高手一般都用此种方法,具体原因,我还不清楚,有待研究
- // public View getView(int position, View convertView, ViewGroup parent) {
- // ViewHolder holder = null;
- // MyListener myListener=null;
- // if (convertView == null) {
- //
- // holder=new ViewHolder();
- //
- // //可以理解为从vlist获取view 之后把view返回给ListView
- // myListener=new MyListener(position);
- //
- // convertView = mInflater.inflate(R.layout.vlist, null);
- // holder.title = (TextView)convertView.findViewById(R.id.title);
- // holder.info = (TextView)convertView.findViewById(R.id.info);
- // holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
- // convertView.setTag(holder);
- // }else {
- // holder = (ViewHolder)convertView.getTag();
- // }
- //
- // holder.title.setText((String)mData.get(position).get("title"));
- // holder.info.setText((String)mData.get(position).get("info"));
- // holder.viewBtn.setTag(position);
- // //给Button添加单击事件 添加Button之后ListView将失去焦点 需要的直接把Button的焦点去掉
- // holder.viewBtn.setOnClickListener( myListener);
- //
- // //holder.viewBtn.setOnClickListener(MyListener(position));
- //
- // return convertView;
- // }
- // }
- //
- // private class MyListener implements OnClickListener{
- // int mPosition;
- // public MyListener(int inPosition){
- // mPosition= inPosition;
- // }
- // @Override
- // public void onClick(View v) {
- // // TODO Auto-generated method stub
- // Toast.makeText(ListViewActivity.this, title[mPosition], Toast.LENGTH_SHORT).show();
- // }
- //
- // }
- //
- //
- //提取出来方便点
- public final class ViewHolder {
- public TextView title;
- public TextView info;
- public Button viewBtn;
- }
- public void showInfo(int position){
- ImageView img=new ImageView(ListViewActivity.this);
- img.setImageResource(R.drawable.b);
- new AlertDialog.Builder(this).setView(img)
- .setTitle("详情"+position)
- .setMessage("菜名:"+title[position]+" 价格:"+info[position])
- .setPositiveButton("确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- }
- })
- .show();
- }
- }
2.main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <ListView
- android:id="@+id/listView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:divider="@drawable/list_line"
- android:dividerHeight="1dip" />
- </LinearLayout>
3.vlist.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <ListView
- android:id="@+id/listView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:divider="@drawable/list_line"
- android:dividerHeight="1dip" />
- </LinearLayout>
4.btn_detail_selecter.xml
- <?xml version="1.0" encoding="utf-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/btn_detail_normal" android:state_enabled="true" android:state_focused="false" android:state_pressed="false"/>
- <item android:drawable="@drawable/btn_detail_pressed" android:state_enabled="true" android:state_pressed="true"/>
- <item android:drawable="@drawable/btn_detail_pressed" android:state_enabled="true" android:state_focused="true"/>
- </selector>
5.item.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/item_higlight" android:state_focused="true" android:state_pressed="false"/>
- <item android:drawable="@drawable/item_higlight" android:state_focused="false" android:state_pressed="true"/>
- <item android:drawable="@drawable/item_higlight" android:state_selected="true"/>
- <item android:drawable="@drawable/item_higlight" android:state_focused="true"/>
- <item android:drawable="@drawable/item_higlight"/>
- </selector>
6.colors.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <resources>
- <color name="region">#8000ff00</color>
- <color name="listTitle">#ff23323b</color>
- <color name="text">#ff848f9b</color>
- <color name="write">#ffffffff</color>
- </resources>
7.values.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="hello">Hello World, ListViewActivity!</string>
- <string name="app_name">ListView</string>
- </resources>
8.drawables.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <resources>
- <item type="drawable" name="bg">#80000000</item>
- <item type="drawable" name="transparent">#00000000</item>
- <item type="drawable" name="lightblue">#ffcfe1ed</item>
- <item type="drawable" name="readmenu_btn_bg_f">#30ffffff</item>
- <item type="drawable" name="readmenu_btn_bg_p">#50ffffff</item>
- <item type="drawable" name="blackMask">#30000000</item>
- </resources>
需要源码的请到github clone,方便的话Follow一下哈: https://github.com/Juneor/ListViewButtonListener
【转】为ListView每个Item上面的按钮添加事件的更多相关文章
- Unity3D的按钮添加事件有三种方式
为Unity3D的按钮添加事件有三种方式,假设我们场景中有一个Canvas对象,Canvas对象中有一个Button对象. 方式一: 创建脚本ClickObject.cs,然后将脚本添加到Canvas ...
- GUI编程笔记(java)06:GUI窗体添加按钮并对按钮添加事件案例
1.需求:把按钮添加到窗体,并对按钮添加一个点击事件. 步骤: (1)创建窗体对象(2)创建按钮对象(3)把按钮添加到窗体(4)窗体显示 2.编写程序思路: 窗体布局:窗体中组件的排列方式 布局分类 ...
- 自定义的UITabbar上面的按钮的x坐标的计算方法
; i < 4; i++) {//4是按钮的个数 NSString *backImage = backgroud[i]; NSString *heightImage = heightBackgr ...
- 用于阻止div上的事件和div上的按钮的事件同时触发
event.stopPropagation() 阻止事件冒泡 用于ie11以上
- 一百、SAP中ALV事件之十三,给ALV的自定义按钮添加事件
一.我们查看定义的按钮,有一个名字是ZADD的自定义按钮 二.代码如下,用于判断点击了哪个按钮 三.点击测试按钮之后,会弹出一个弹窗 完美
- JS闭包导致循环给按钮添加事件时总是执行最后一个
加入如下脚本代码: <script> var list_obj = document.getElementsByTagName('li'); for (var i = 0; i <= ...
- bootstraptable为行中的按钮添加事件
- Plupload 上传详细讲解,Plupload 多实例上传,Plupload多个上传按钮--推荐使用
今天帮朋友解决 Plupload 上传的问题,查了很多资料,资料还是挺全的,但是有点零零散散的,故整理好,合并发出来. 本教程包括: Plupload 上传详细讲. Plupload 多实例上 ...
- ListView的Item被点击和其中的Button被点击同时生效
Android开发中在ListView中经常有Button或ImageButton等需要被点击的控件,如果不加一些特殊的限制,有可能 ListView的Item的点击事件或Button的点击事件,其中 ...
随机推荐
- uiscrollview上的 uipangesturerecognizer冲突
最近在tableview里的cell imageview加了个 uipangesturerecognizer发现优先滚动imageview,往上拖的时候,tableView不响应滚动了,原来是tabl ...
- [转]SQL语句:Group By总结
1. Group By 语句简介: Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若 ...
- 当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand问题解决
1.目前看主要因为两种,第一种是select语句没有包含主键列,select * 就可以解决.或 select 主键列 这里的主键是指的primary key而不是unique key 2.最重要的 ...
- 你喜欢使用eclipse+tomcat编程吗?!
在eclipse中配置tomcat简直是一场灾难! 开源软件确实给开发者极大的自由,但,同时也带来额外的麻烦. eclipse+tomcat只是其中之一.我有幸碰到了N次,在N+1次时,不得不提笔撰文 ...
- Mysql备份数据库的一种方法
今天添加了一个数据库自动备份的模块,mysql数据备份的方法有很多,可以对单个数据库备份,可以多个数据库备份,也可以对某一个表进行备份,可以只备份数据库的结构不备份数据,可以根据需要做不同处理,正好现 ...
- e+开发中的各种问题
1.数据交换后走的查询公式还是controller所配置的公式
- notepad++插件使用说明
在进行渗透测试的过程中,经常需要分析一些js或xml文件,或者是一些url,它们多是经过压缩或编码的,看起来不方便.这里介绍几款常用的notepad++插件,会极大的方便我们的开发测试. 1 Xml ...
- .net ajax式上传文件
今天在这里介绍一下ajax上传文件.其实也不算是真的使用xmlhttprequest上传,只是使用了iframe实现了无刷新上传而已,最多也只算 是仿ajax上传文件.然而网上关于使用xmlhttpr ...
- ruby环境sass编译中文出现Syntax error: Invalid GBK character错误解决方法
sass文件编译时候使用ruby环境,无论是界面化的koala工具还是命令行模式的都无法通过,真是令人烦恼. 容易出现中文注释时候无法编译通过,或者出现乱码,找了几天的解决方法终于解决了. 这个问题的 ...
- linux下进度条的简单实现
在实现进度条之前,先学习一下makefile. 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中, makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编 ...