zoukankan      html  css  js  c++  java
  • Android Listview中Button按钮点击事件冲突解决办法

      今天做项目时,ListView中含有了Button组件,心里一早就知道肯定会有冲突,因为以前就遇到过,并解决过,可惜当时没有记录下来。 今天在做的时候,继续被这个问题郁闷了一把,后来解决后,赶紧来记录下,以便日后参考。

      

      首先,其实Listview中Button按钮点击事件冲突这种问题压根就不是太大的问题,因为我们完全可以将一个TextView的Backgroud设置成一个selector,也可以将一个TextView设计成一个按钮的样子,这样就可以绕过ListView和Button的冲突问题!

       

      当然,如果非要使用Button,那可以利用以下方案解决。

      首先,要了解的是,ListView和其它能触发点击事件的widget无法一起正常工作的原因是加入其它widget后,ListView的itemclick事件被其它widget的click事件屏蔽,所以将无法触发。

      如何做呢?

    定义list_item_btn.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" >
    
        <ImageView
            android:id="@+id/avatar"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:src="@drawable/ic_launcher" />
    
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="10dp" >
    
            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:padding="6dp"
                android:text="玫瑰花园"
                android:textSize="16sp" />
    
            <Button
                android:id="@+id/btn"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_margin="2dp"
                android:focusable="false"
                android:padding="6dp"
                android:text="玫瑰花园"
                android:textSize="16sp" />
        </LinearLayout>
    
    </LinearLayout>


    注; Button的android:focusable必须设置为false,以免它抢了父控件(也就是每一个Item)的焦点。


    接下来,我们定义一个Bean,Plan.java:

    public class Plan {
    	
    	public String name;
    	
    	public String avatar;
    
    	public Plan(String name, String avatar) {
    		super();
    		this.name = name;
    		this.avatar = avatar;
    	}
    
    	@Override
    	public String toString() {
    		return "Plan [name=" + name + ", avatar=" + avatar + "]";
    	}
    	
    }

    实现ListView的Adapter,MyAdapter.java:

    package com.wuyuan.listbtn;
    
    import java.util.List;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.View.OnClickListener;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class MyAdapter extends BaseAdapter {
    
    	private Context mContext;
    
    	private LayoutInflater mInflater;
    
    	private List<Plan> mDatas;
    
    	private OnClickListener onClickListener;
    
    	public MyAdapter(Context context, List<Plan> datas,
    			OnClickListener onClickListener) {
    		mContext = context;
    		mInflater = LayoutInflater.from(mContext);
    		mDatas = datas;
    		this.onClickListener = onClickListener;
    	}
    
    	@Override
    	public int getCount() {
    		return (mDatas != null ? mDatas.size() : 0);
    	}
    
    	@Override
    	public Object getItem(int position) {
    		return (mDatas != null ? mDatas.get(position) : null);
    	}
    
    	@Override
    	public long getItemId(int position) {
    		return position;
    	}
    
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		ViewHolder holder = null;
    		if (convertView == null) {
    
    			// 下拉项布局
    			convertView = mInflater.inflate(R.layout.list_item_btn, null);
    
    			holder = new ViewHolder();
    
    			holder.avatar = (ImageView) convertView.findViewById(R.id.avatar);
    			holder.title = (TextView) convertView.findViewById(R.id.title);
    			holder.btn = (Button) convertView.findViewById(R.id.btn);
    
    			convertView.setTag(holder);
    
    		} else {
    			holder = (ViewHolder) convertView.getTag();
    		}
    
    		Plan plan = mDatas.get(position);
    
    		if (plan != null) {
    
    			holder.title.setText(plan.name);
    			// 通常将position设置为tag,方便之后判断点击的button是哪一个
    			holder.btn.setTag(position);
    			holder.btn.setOnClickListener(this.onClickListener);
    		}
    
    		return convertView;
    	}
    
    	static class ViewHolder {
    
    		ImageView avatar;
    
    		TextView title;
    
    		Button btn;
    	}
    
    }
    

    注:

     1. 构造方法中,我们传入了OnClickListener,主要是为了让每一个Item的Button监听该事件.

     2. holder.btn.setOnClickListener(this.onClickListener); 为Button设置点击事件监听。

     3. 为Button设置tag,tag的值为position,这样可以方便获取该Button所在的List中的位置。


    最后,设置列表及事件监听:

    public class MainActivity extends Activity {
    
    	private ListView list_view;
    	private List<Plan> plans;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		list_view = (ListView) findViewById(R.id.list_view);
    
    		plans = new ArrayList<Plan>();
    		for (int i = 0; i < 10; i++) {
    			plans.add(new Plan("无缘公子-宁帅" + i, ""));
    		}
    
    		MyAdapter mAdapter = new MyAdapter(this, plans,onClickListener);
    		list_view.setAdapter(mAdapter);
    
    		list_view.setOnItemClickListener(new OnItemClickHandler());
    	}
    
    	private class OnItemClickHandler implements OnItemClickListener {
    
    		@Override
    		public void onItemClick(AdapterView<?> parent, View view, int position,
    				long id) {
    
    			System.out.println(" position1 :" + position);
    			System.out.println(" data1 :" + plans.get(position).toString());
    		}
    
    	}
    	
    	private OnClickListener onClickListener = new OnClickListener() {
    		
    		@Override
    		public void onClick(View view) {
    			Button btn = (Button) view;
    			
    			int pos = (Integer) btn.getTag();
    			
    			System.out.println(" position2 :" + pos);
    			System.out.println(" data2 :" + plans.get(pos).toString());
    		}
    	};
    }


    源码下载地址(免费): http://download.csdn.net/detail/zuiwuyuan/9192201

  • 相关阅读:
    java 字符串大小比较
    安卓应用如何赚钱
    报错找不到jquery-1.10.2.min.map解决办法
    android 中 webview 怎么用 localStorage?
    HTML5 本地存储
    js获取url参数值
    java调用webservice
    点圆的关系---1
    数学建模入门书籍介绍
    北京秋日风景-最大的银杏林海景色
  • 原文地址:https://www.cnblogs.com/hehe520/p/6329959.html
Copyright © 2011-2022 走看看