最近有人问我,在Android里:

在自定义listView里面有按钮,然后setItemClickListener时不响应,网上很多关于这个的,但我都试过,貌似都解决不了。 其实刚开始学Android接触ListView时我也遇到此问题,在网上到处搜也难以找到相关解决方案,原因之一是网上原创文章少,转载居多,很多文章都雷同;原因之二在于自己英语不好,不敢上外文论坛去找。 后来经过自己的慢慢摸索终于解决了这个问题。 当朋友问我时,我一番简单讲解加几张代码截图就给他解决问题啦~ 废话不多说,先上源代码: 源代码 代码片段: main.xml
    
在main布局里加入了一个列表控件,ListView,它的各个属性在此处不是重点,这里就不多说,看不懂的读者自己去网上搜吧! datalist.xml
<?xml version="1.0" encoding="utf-8"?>        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() {@Overridepublic 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);}};@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic 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);}};@Overrideprotected 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() {@Overridepublic 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,只是稍微给他丰富了一下子元素,以实现更好看的界面效果,当然,我这个不好看哈,只是为了写博文的演示罢了。 运行截图: Android中ListView实现子控件点击事件后ListView点击事件失效解决办法_第1张图片 Android中ListView实现子控件点击事件后ListView点击事件失效解决办法_第2张图片  Android中ListView实现子控件点击事件后ListView点击事件失效解决办法_第3张图片   代码都贴出来了,说明文字不多,但应该基本说清楚了,读者慢慢看吧,主要还是研读代码,尝试着慢慢修改变成自己的并从中学到一些东西才是重点!   一如既往,欢迎广大读者提出批评及改进意见,我一定会不断努力的~

我的QQ:1239848066

反馈请猛戳:

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


 

 

更多相关文章

  1. 《Android第一行代码》笔记
  2. Android 实现自定义控件效果1
  3. 一步一步学android之基本控件——TextView组件
  4. Android开心消消乐代码实例详解
  5. 关于Android开发完全讲义将网络图像装载到ListView控件的修改
  6. Android同一套代码打多个APP包并能够在同一个手机上安装运行
  7. android实现短按电源键关机的实现代码

随机推荐

  1. 移动互联网应用技术架构简介-Android
  2. 移动互联网的新宠:Android之缤纷世界
  3. 彻底解决Android(安卓)GPS没法定位这一顽
  4. android:layout_gravity 和 android:grav
  5. Android中关于android:imeOptions="actio
  6. Android(安卓)开发艺术探索笔记之七 -- A
  7. 【Android您问我讲】Android(安卓)2.x中
  8. android学习日记01-搭配开发环境
  9. Android进程 Handler Message Looper
  10. 移动互联网的新宠:Android之缤纷世界