热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android中ListView实现子控件点击事件后ListView点击事件失效解决办法

最近有人问我,在Android里:在自定义listView里面有按钮,然后setItemClickListener时不响应,网上很多关于这个的,但我都试过,貌似都解决不了。

最近有人问我,在Android里:

在自定义listView里面有按钮,然后setItemClickListener时不响应,网上很多关于这个的,但我都试过,貌似都解决不了。
其实刚开始学Android接触ListView时我也遇到此问题,在网上到处搜也难以找到相关解决方案,原因之一是网上原创文章少,转载居多,很多文章都雷同;原因之二在于自己英语不好,不敢上外文论坛去找。
后来经过自己的慢慢摸索终于解决了这个问题。
当朋友问我时,我一番简单讲解加几张代码截图就给他解决问题啦~
废话不多说,先上源代码: 源代码
代码片段:
main.xml


    

在main布局里加入了一个列表控件,ListView,它的各个属性在此处不是重点,这里就不多说,看不懂的读者自己去网上搜吧!
datalist.xml



    

    android:OnClick="OnItemEditClick"
        android:paddingRight="5px" />

    

    

列表控件单独布局,在里面加入了三个TextView,一个ImageButton,显示时三个TextView 在前面,最后一个ImageButton。
之前说到的按钮点击事件在Activity里用button.setOnClickListener的方式实现时会屏蔽/占用ListView单项单击事件,这里就在布局里加了一个 android:OnClick="OnItemEditClick" ,用于绑定按钮点击事件,然后在java代码中实现这个方法,记得须有一个 View类型的参数
MainActivity.java
package com.test.customlistview;

import java.util.ArrayList;
import java.util.HashMap;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemLongClickListener;

public class MainActivity extends Activity {
	
	ListView dataListView;
	SimpleAdapter listAdapter;
	ArrayList> list;
	private int location;
	Handler mHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			if (msg.arg1 == 1) {

			} else if (msg.arg1 == 2) {

			} else if (msg.arg1 == 4) {
				if (msg.what == 1) {
					dataListView.getChildAt(msg.arg2).setBackgroundResource(
							R.drawable.itemback);
				}
			}
			super.handleMessage(msg);
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		dataListView = (ListView) findViewById(R.id.lv_list);
		list = new ArrayList>();
		int count = 20;
		HashMap map;
		for (int i = 1; i <= count; i++) {
			map = new HashMap();
			map.put("num", i+ "");
			map.put("a1", "²=");
			map.put("a2", ""+i*i);
			list.add(map);
		}
		listAdapter = new SimpleAdapter(this, list, R.layout.datalist,
				new String[] { "num", "a1", "a2" }, new int[] { R.id.tv_num,
						R.id.tv_numx, R.id.tv_numy });
		dataListView.setAdapter(listAdapter);
		dataListView.setOnItemLongClickListener(new OnItemLongClickListener() {
			public boolean onItemLongClick(AdapterView arg0, View view,
					int position, long id) {
				location = position;
				final View nowView = (View) view.findViewById(R.id.ib_edit);
				Toast.makeText(getBaseContext(), "location=" + location, 2000)
						.show();
				OnClickListener listener = new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						if (which == 0) {
							Toast.makeText(getBaseContext(), "编辑", Toast.LENGTH_LONG).show();
						} else if (which == 1) {
							Toast.makeText(getBaseContext(), "删除", Toast.LENGTH_LONG).show();
						}
					}
				};
				dataListView.getChildAt(location).setBackgroundResource(
						R.drawable.item_frame);
				Message message = new Message();
				message.arg1 = 4;
				message.arg2 = location;
				message.what = 1;
				mHandler.sendMessageDelayed(message, 500);
				String[] Menu = { "编辑", "删除" };
			
				new AlertDialog.Builder(MainActivity.this).setItems(Menu,
						listener).show();
				return false;
			}
		});
	}
	
	public void OnItemEditClick(View v) {
		RelativeLayout layout = (RelativeLayout) v.getParent();
		TextView tv1=(TextView)layout.findViewById(R.id.tv_num);
		TextView tv2=(TextView)layout.findViewById(R.id.tv_numx);
		TextView tv3=(TextView)layout.findViewById(R.id.tv_numy);
		ImageButton ib=(ImageButton)layout.findViewById(R.id.ib_edit);
		String str="按钮"+tv1.getText()+"点击啦\n"+tv1.getText()+tv2.getText()+tv3.getText();
		Toast.makeText(getBaseContext(), str, Toast.LENGTH_LONG).show();
	}
}
OnItemEditClick(View v)方法中通过v.getParent();找到她的容器控件,前面的(RelativeLayout)根据你自己的布局里的容器控件而定。然后即可使用该容器控件找到他的所有自控件,然后读者想干嘛就干嘛啦~
上面的dataListView.setOnItemLongClickListener实现ListView的item长按事件,我在这里加了一个显示两条菜单的对话框,用于进行其他操作,如编辑、删除等。
这里也可以实现ListView的点击事件,PS:这段代码是后来加的,直接嵌入源代码中即可,已调试无误。
 
dataListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView arg0, View view, int arg2,
					long arg3) {
				TextView tv=(TextView)view.findViewById(R.id.tv_num);
				Toast.makeText(getBaseContext(), "您点击了第" + tv.getText()+"行", 2000).show();
			}
		});
修改后的MainActivity.java代码如下
package com.test.customlistview;

import java.util.ArrayList;
import java.util.HashMap;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemLongClickListener;

public class MainActivity extends Activity {
	
	ListView dataListView;
	SimpleAdapter listAdapter;
	ArrayList> list;
	private int location;
	Handler mHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			if (msg.arg1 == 1) {

			} else if (msg.arg1 == 2) {

			} else if (msg.arg1 == 4) {
				if (msg.what == 1) {
					dataListView.getChildAt(msg.arg2).setBackgroundResource(
							R.drawable.itemback);
				}
			}
			super.handleMessage(msg);
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		dataListView = (ListView) findViewById(R.id.lv_list);
		list = new ArrayList>();
		int count = 20;
		HashMap map;
		for (int i = 1; i <= count; i++) {
			map = new HashMap();
			map.put("num", i+ "");
			map.put("a1", "²=");
			map.put("a2", ""+i*i);
			list.add(map);
		}
		listAdapter = new SimpleAdapter(this, list, R.layout.datalist,
				new String[] { "num", "a1", "a2" }, new int[] { R.id.tv_num,
						R.id.tv_numx, R.id.tv_numy });
		dataListView.setAdapter(listAdapter);
		dataListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView arg0, View view, int arg2,
					long arg3) {
				TextView tv=(TextView)view.findViewById(R.id.tv_num);
				Toast.makeText(getBaseContext(), "您点击了第" + tv.getText()+"行", 2000).show();
			}
		});
		dataListView.setOnItemLongClickListener(new OnItemLongClickListener() {
			public boolean onItemLongClick(AdapterView arg0, View view,
					int position, long id) {
				location = position;
				final View nowView = (View) view.findViewById(R.id.ib_edit);
				Toast.makeText(getBaseContext(), "location=" + location, 2000)
						.show();
				OnClickListener listener = new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						if (which == 0) {
							Toast.makeText(getBaseContext(), "编辑", Toast.LENGTH_LONG).show();
						} else if (which == 1) {
							Toast.makeText(getBaseContext(), "删除", Toast.LENGTH_LONG).show();
						}
					}
				};
				dataListView.getChildAt(location).setBackgroundResource(
						R.drawable.item_frame);
				Message message = new Message();
				message.arg1 = 4;
				message.arg2 = location;
				message.what = 1;
				mHandler.sendMessageDelayed(message, 500);
				String[] Menu = { "编辑", "删除" };
			
				new AlertDialog.Builder(MainActivity.this).setItems(Menu,
						listener).show();
				return false;
			}
		});
	}
	
	public void OnItemEditClick(View v) {
		RelativeLayout layout = (RelativeLayout) v.getParent();
		TextView tv1=(TextView)layout.findViewById(R.id.tv_num);
		TextView tv2=(TextView)layout.findViewById(R.id.tv_numx);
		TextView tv3=(TextView)layout.findViewById(R.id.tv_numy);
		ImageButton ib=(ImageButton)layout.findViewById(R.id.ib_edit);
		String str="按钮"+tv1.getText()+"点击啦\n"+tv1.getText()+tv2.getText()+tv3.getText();
		Toast.makeText(getBaseContext(), str, Toast.LENGTH_LONG).show();
	}
}

注:这个小demo根本算不上自定义ListView,只是稍微给他丰富了一下子元素,以实现更好看的界面效果,当然,我这个不好看哈,只是为了写博文的演示罢了。
运行截图:
截图一 截图二  截图三
 
代码都贴出来了,说明文字不多,但应该基本说清楚了,读者慢慢看吧,主要还是研读代码,尝试着慢慢修改变成自己的并从中学到一些东西才是重点!
 
一如既往,欢迎广大读者提出批评及改进意见,我一定会不断努力的~

我的QQ:1239848066

反馈请猛戳:

原创博客:转载后记得附带原文链接,谢谢~


 

 


推荐阅读
  • 深入解析 Android Drawable:第六阶段进阶指南 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • Android ListView 自定义 CheckBox 实现列表项多选功能详解
    本文详细介绍了在Android开发中如何在ListView的每一行添加CheckBox,以实现列表项的多选功能。用户不仅可以通过点击复选框来选择项目,还可以通过点击列表的任意一行来完成选中操作,提升了用户体验和操作便捷性。同时,文章还探讨了相关的事件处理机制和布局优化技巧,帮助开发者更好地实现这一功能。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 为了优化直播应用底部聊天框的弹出机制,确保在不同设备上的布局稳定性和兼容性,特别是在配备虚拟按键的设备上,我们对用户交互流程进行了调整。首次打开应用时,需先点击首个输入框以准确获取键盘高度,避免直接点击第二个输入框导致的整体布局挤压问题。此优化通过调整 `activity_main.xml` 布局文件实现,确保了更好的用户体验和界面适配。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 在探讨C语言编程文本编辑器的最佳选择与专业推荐时,本文将引导读者构建一个基础的文本编辑器程序。该程序不仅能够打开并显示文本文件的内容及其路径,还集成了菜单和工具栏功能,为用户提供更加便捷的操作体验。通过本案例的学习,读者可以深入了解文本编辑器的核心实现机制。 ... [详细]
  • 深入解析 Android 选择器与形状绘制技术
    本文深入探讨了 Android 中选择器(Selector)与形状绘制(Shape Drawing)技术的应用与实现。重点分析了 `Selector` 的 `item` 元素,其中包括 `android:drawable` 属性的使用方法及其在不同状态下的表现。此外,还详细介绍了如何通过 XML 定义复杂的形状和渐变效果,以提升 UI 设计的灵活性和美观性。 ... [详细]
  • 深入解析JavaScript中的函数防抖与节流技术及其应用场景
    本文深入探讨了JavaScript中函数防抖和节流技术的原理及应用场景。通过详细的示例代码,全面解析了这两种优化方法在实际开发中的重要作用,为开发者提供了宝贵的参考和实践指导。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 本文探讨了在Android应用中实现动态滚动文本显示控件的优化方法。通过详细分析焦点管理机制,特别是通过设置返回值为`true`来确保焦点不会被其他控件抢占,从而提升滚动文本的流畅性和用户体验。具体实现中,对`MarqueeText.java`进行了代码层面的优化,增强了控件的稳定性和兼容性。 ... [详细]
  • 本文首先回顾了MySQL在数据字典方面的发展历程,从MySQL 4.1引入的information_schema数据字典开始,使得用户能够通过标准SQL查询轻松获取系统元数据。在此基础上,深入探讨了MySQL 5.7中SYS模式的架构与应用场景,详细解析了其在性能监控、查询优化等方面的优势与实际应用。 ... [详细]
author-avatar
嘻嘻2502891803
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有