转载地址:http://blog.csdn.net/zuiwuyuan/article/details/44839211
今天做项目时,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);
-
- 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());
- }
- };
- }