把listview的item和button一起设置为一个点击事件

解决方案 »

  1.   

    item和button是分别不同的事件。
      

  2.   

    不太理解你想问什么,是item点击事件被Button抢了,然后获取不到事件吗?
      

  3.   

    button在listview的item里,item获取焦点了,button自然也在里面,正常啊。
      

  4.   

    这是没有办法避免滴啊,除非你在点击ITEM的时候,为BUTTON写个事件,让BUTTON不变
      

  5.   

    写了个例子,项目本身和项目里面的按钮都能点击,互补干扰,看源码:首先主界面: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: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;
    }
    }
        
        };
    }
      

  6.   

    一般来说Button背景只要不设置Transparent,给ListView子项设置选中背景是不会对Button背景有影响的
      

  7.   

    在item最外层里加一个android:descendantFocusability="blocksDescendants"
      

  8.   

    项目测试过的,不能运行是因为你建立的工程可能不对,这几个xml和java文件绝对是可以运行了!
      

  9.   

    重点就是android:focusable="false" android:clickable="true"
      

  10.   

    上面的各位都没有懂起我的意思啊,我是说点击Item的时候Button颜色也会跟着变。颜色啊,颜色!!!!
    它们的事件是不会相互影响的。关键是“点击Item的时候Button也会有那种被点击的颜色变化,它们事件没有相互影响
      

  11.   

    找到原因了,是t为大写的缘故,改为小写就行了,新手,呵呵
                android:name=".testListViewActivity"
      

  12.   

    这个问题算了,一直找不到答案
    直接使用ImageView来替代解决。
      

  13.   

    我也是遇到这样的问题,问题解决了
    不要用listview的setItemOnClick方法,给listview里面其他不包含该button的地方设置点击动作,我就是给button上面的LinerLayout设置了onclicklistener
    楼上的都说得很对,button在item里面,当item获得点击动作button也会获得点击动作,所以必须从这个角度出发去解决
    发个图大致就能看懂了
    http://vdisk.weibo.com/s/aAL7x
      

  14.   

    我也是遇到这样的问题,问题解决了
    不要用listview的setItemOnClick方法,给listview里面其他不包含该button的地方设置点击动作,我就是给button上面的LinerLayout设置了onclicklistener
    楼上的都说得很对,button在item里面,当item获得点击动作button也会获得点击动作,所以必须从这个角度出发去解决
    发个图大致就能看懂了
    http://vdisk.weibo.com/s/aAL7x
      

  15.   

    重写button
    @Override
    public void setPressed(boolean pressed) {
    // TODO Auto-generated method stub
    if(pressed&&getParent() instanceof View&& ((View)getParent()).isPressed())
    return;
    super.setPressed(pressed);
    }