ListView和Button在一起的时候的一个问题 把listview的item和button一起设置为一个点击事件 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 item和button是分别不同的事件。 不太理解你想问什么,是item点击事件被Button抢了,然后获取不到事件吗? button在listview的item里,item获取焦点了,button自然也在里面,正常啊。 这是没有办法避免滴啊,除非你在点击ITEM的时候,为BUTTON写个事件,让BUTTON不变 写了个例子,项目本身和项目里面的按钮都能点击,互补干扰,看源码:首先主界面:listview_main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="测试listview内含button" /> <ListView android:id="@+id/code_list" android:background="#ffffffff" android:fadingEdgeLength="0.0sp" android:layout_width="fill_parent" android:layout_height="fill_parent" android:drawSelectorOnTop="false" android:cacheColorHint="#ffffffff" android:dividerHeight="2.0dip" android:layout_weight="0.0" android:fastScrollEnabled="true" android:scrollbars="none" /></LinearLayout>然后项目布局:listview_item_button.xml<?xml version="1.0" encoding="utf-8"?><!-- ListView Item --><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:minHeight="40dip" android:gravity="center_vertical" android:descendantFocusability= "blocksDescendants"> <Button android:textSize="17sp" android:textStyle="bold" android:textColor="#ff000000" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="点击按钮" android:id="@+id/btnCktp" android:layout_alignParentRight="true" android:focusable="false" android:clickable="true"/> <TextView android:id="@+id/tvMsg" android:layout_width="fill_parent" android:layout_height="40dip" android:textSize="16dip" android:gravity="center_vertical|left" android:textColor="#ff000000" android:layout_alignParentLeft="true" android:layout_toLeftOf="@id/btnCktp"> </TextView></RelativeLayout>测试activity:testListViewActivitypackage bee.android.control;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.TextView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.widget.Toast;public class testListViewActivity extends Activity { ListView code_list; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview_main); code_list = (ListView)findViewById(R.id.code_list); // 给listview赋值,模拟数据 List<Map<String, Object>> alls = new ArrayList<Map<String, Object>>(); for(int i=0;i<20;i++){ Map<String, Object> map = new HashMap<String, Object>(); map.put("Id", i); map.put("Text", "测试数据,当前第"+(i+1)+"行"); alls.add(map); } ListAdapter adapter = new ListAdapter(this,alls); adapter.setHandler(_handler); code_list.setAdapter(adapter); code_list.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub Toast.makeText(testListViewActivity.this, "你点击了项目"+position, Toast.LENGTH_SHORT).show(); } }); } // 自定义adapter public class ListAdapter extends BaseAdapter{ private Context con; private LayoutInflater lif; private List<Map<String, Object>> alls = new ArrayList<Map<String, Object>>(); private Handler handler; public ListAdapter(Context context,List<Map<String, Object>> alls){ this.con = context; this.lif = (LayoutInflater) con. getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.alls = alls; } // handler回发是为了处理每个按钮的点击事件 public void setHandler(Handler handler){ this.handler = handler; } @Override public int getCount() { // TODO Auto-generated method stub return alls.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return alls.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View view, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder = null; if (view == null) { view = this.lif.inflate(R.layout.listview_item_button, null); holder = new ViewHolder(); holder.tvMsg = (TextView)view.findViewById(R.id.tvMsg); view.setTag(holder); }else{ holder = (ViewHolder)view.getTag(); } // 赋值 Map<String, Object> map = alls.get(position); holder.tvMsg.setText(map.get("Text").toString()); holder.btnCktp = (Button)view.findViewById(R.id.btnCktp); holder.btnCktp.setText("按钮"+map.get("Id").toString()); // 单击事件 holder.btnCktp.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub if(handler != null){ Message msg = handler.obtainMessage(); msg.what = v.getId(); msg.arg1 = position; handler.sendMessage(msg); } } }); return view; } /** * * 列表项控件集合 * */ public class ViewHolder{ TextView tvMsg;//文本〉〉〉 Button btnCktp;//按钮 } } Handler _handler = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch(msg.what){//如果item项目里有多个按钮触发,可以在这里区分 case R.id.btnCktp: Toast.makeText(testListViewActivity.this, "你点击了按钮"+msg.arg1, Toast.LENGTH_SHORT).show(); break; } } };} 一般来说Button背景只要不设置Transparent,给ListView子项设置选中背景是不会对Button背景有影响的 在item最外层里加一个android:descendantFocusability="blocksDescendants" 项目测试过的,不能运行是因为你建立的工程可能不对,这几个xml和java文件绝对是可以运行了! 重点就是android:focusable="false" android:clickable="true" 上面的各位都没有懂起我的意思啊,我是说点击Item的时候Button颜色也会跟着变。颜色啊,颜色!!!!它们的事件是不会相互影响的。关键是“点击Item的时候Button也会有那种被点击的颜色变化,它们事件没有相互影响” 找到原因了,是t为大写的缘故,改为小写就行了,新手,呵呵 android:name=".testListViewActivity" 这个问题算了,一直找不到答案直接使用ImageView来替代解决。 我也是遇到这样的问题,问题解决了不要用listview的setItemOnClick方法,给listview里面其他不包含该button的地方设置点击动作,我就是给button上面的LinerLayout设置了onclicklistener楼上的都说得很对,button在item里面,当item获得点击动作button也会获得点击动作,所以必须从这个角度出发去解决发个图大致就能看懂了http://vdisk.weibo.com/s/aAL7x 我也是遇到这样的问题,问题解决了不要用listview的setItemOnClick方法,给listview里面其他不包含该button的地方设置点击动作,我就是给button上面的LinerLayout设置了onclicklistener楼上的都说得很对,button在item里面,当item获得点击动作button也会获得点击动作,所以必须从这个角度出发去解决发个图大致就能看懂了http://vdisk.weibo.com/s/aAL7x 重写button@Override public void setPressed(boolean pressed) { // TODO Auto-generated method stub if(pressed&&getParent() instanceof View&& ((View)getParent()).isPressed()) return; super.setPressed(pressed); } 查询SIM里的联系人报空指针异常 关于系统横竖屏 易通万年历:自己开发了个安卓版的万年历,纯绿色 求助:怎样虚拟android中模拟器的SD卡 android中在TextView上显示文字时如何处理对齐 请教高手,到底什么情况用activity的启动属性 如果在listview里点击该行的按钮,从而获取该行的内容 Android版的Javaeye新闻阅读器 android4.0应用程序调用二进制程序权限问题 用volley封装fastJson,求指点ordemo android 图片不能拉伸,apk图标 怎么将数据库获取的数据显示在Spinner中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="测试listview内含button"
/>
<ListView android:id="@+id/code_list" android:background="#ffffffff"
android:fadingEdgeLength="0.0sp" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:drawSelectorOnTop="false"
android:cacheColorHint="#ffffffff" android:dividerHeight="2.0dip"
android:layout_weight="0.0" android:fastScrollEnabled="true"
android:scrollbars="none" />
</LinearLayout>然后项目布局:listview_item_button.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- ListView Item -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:minHeight="40dip" android:gravity="center_vertical"
android:descendantFocusability= "blocksDescendants"> <Button android:textSize="17sp" android:textStyle="bold"
android:textColor="#ff000000" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="点击按钮" android:id="@+id/btnCktp"
android:layout_alignParentRight="true"
android:focusable="false" android:clickable="true"/> <TextView android:id="@+id/tvMsg" android:layout_width="fill_parent"
android:layout_height="40dip" android:textSize="16dip"
android:gravity="center_vertical|left" android:textColor="#ff000000"
android:layout_alignParentLeft="true" android:layout_toLeftOf="@id/btnCktp">
</TextView></RelativeLayout>测试activity:testListViewActivity
package bee.android.control;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;public class testListViewActivity extends Activity {
ListView code_list;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_main);
code_list = (ListView)findViewById(R.id.code_list);
// 给listview赋值,模拟数据
List<Map<String, Object>> alls = new ArrayList<Map<String, Object>>();
for(int i=0;i<20;i++){
Map<String, Object> map = new HashMap<String, Object>();
map.put("Id", i);
map.put("Text", "测试数据,当前第"+(i+1)+"行");
alls.add(map);
}
ListAdapter adapter = new ListAdapter(this,alls);
adapter.setHandler(_handler);
code_list.setAdapter(adapter);
code_list.setOnItemClickListener(new OnItemClickListener(){ @Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub Toast.makeText(testListViewActivity.this, "你点击了项目"+position, Toast.LENGTH_SHORT).show();
}
});
}
// 自定义adapter
public class ListAdapter extends BaseAdapter{ private Context con;
private LayoutInflater lif;
private List<Map<String, Object>> alls = new ArrayList<Map<String, Object>>();
private Handler handler;
public ListAdapter(Context context,List<Map<String, Object>> alls){
this.con = context;
this.lif = (LayoutInflater) con.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.alls = alls;
}
// handler回发是为了处理每个按钮的点击事件
public void setHandler(Handler handler){
this.handler = handler;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return alls.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return alls.get(position);
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getView(final int position, View view, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder = null;
if (view == null) {
view = this.lif.inflate(R.layout.listview_item_button, null);
holder = new ViewHolder();
holder.tvMsg = (TextView)view.findViewById(R.id.tvMsg);
view.setTag(holder);
}else{
holder = (ViewHolder)view.getTag();
}
// 赋值
Map<String, Object> map = alls.get(position);
holder.tvMsg.setText(map.get("Text").toString());
holder.btnCktp = (Button)view.findViewById(R.id.btnCktp);
holder.btnCktp.setText("按钮"+map.get("Id").toString());
// 单击事件
holder.btnCktp.setOnClickListener(new OnClickListener(){ @Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(handler != null){
Message msg = handler.obtainMessage();
msg.what = v.getId();
msg.arg1 = position;
handler.sendMessage(msg);
}
}
});
return view;
}
/**
*
* 列表项控件集合
*
*/
public class ViewHolder{
TextView tvMsg;//文本〉〉〉
Button btnCktp;//按钮
}
}
Handler _handler = new Handler(){ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch(msg.what){//如果item项目里有多个按钮触发,可以在这里区分
case R.id.btnCktp:
Toast.makeText(testListViewActivity.this, "你点击了按钮"+msg.arg1, Toast.LENGTH_SHORT).show();
break;
}
}
};
}
它们的事件是不会相互影响的。关键是“点击Item的时候Button也会有那种被点击的颜色变化,它们事件没有相互影响”
android:name=".testListViewActivity"
直接使用ImageView来替代解决。
不要用listview的setItemOnClick方法,给listview里面其他不包含该button的地方设置点击动作,我就是给button上面的LinerLayout设置了onclicklistener
楼上的都说得很对,button在item里面,当item获得点击动作button也会获得点击动作,所以必须从这个角度出发去解决
发个图大致就能看懂了
http://vdisk.weibo.com/s/aAL7x
不要用listview的setItemOnClick方法,给listview里面其他不包含该button的地方设置点击动作,我就是给button上面的LinerLayout设置了onclicklistener
楼上的都说得很对,button在item里面,当item获得点击动作button也会获得点击动作,所以必须从这个角度出发去解决
发个图大致就能看懂了
http://vdisk.weibo.com/s/aAL7x
@Override
public void setPressed(boolean pressed) {
// TODO Auto-generated method stub
if(pressed&&getParent() instanceof View&& ((View)getParent()).isPressed())
return;
super.setPressed(pressed);
}