怎样解决ListView条目中的Button事件

来源:互联网 发布:淘宝举报假冒伪劣 编辑:程序博客网 时间:2024/05/16 13:57

ListView条目中的button事件的监听以及子控件与父控件的事件冲突处理

1.事件冲突处理

listview的条目中当子项包括Button或者CheckBoX等控件时,点击条目无效。这里是因为Button或者CheckBoX将条目上的焦点抢走了。
解决方法:在listview条目的 根布局 中加 上

android:descendantFocusability="blocksDescendants"

android:descendantFocusability
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。

属性的值有三种:

    beforeDescendants:viewgroup会优先其子类控件而获取到焦点    afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点    blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

一般我们会选择第三种。
好了就这样冲突问题就解决了;

ListView中获取view对象注意的问题;

只讲一点关于getview()方法中怎样获得视图对象的;
LayoutInflater view = LayoutInflater.from(mContext);
1. convertView = view.inflate(R.layout.item_list, null);
2. convertView = view.inflate(R.layout.item_list, parent, false);
这里许多人为了简便喜欢用第一种表达式,但其实通过下面的源码我们知道,

    public View inflate(@LayoutRes int resource, @Nullable ViewGroup root) {        return inflate(resource, root, root != null);    }

方法1最终会调用方法2.所以以后书写的过程中最好是直接调用后者

下面正式进入主题--ListView中子控件的点击事件如何操作!

1.首先明白一点listview条目是不支持子控件的点击事件的,所以这里我们需要自定义条目子控件的点击事件。

原理:

  • 首先需要自定义一个类去实现View.OnClickListener代码如下
class MyListener implements View.OnClickListener {        int mPosition;        public MyListener(int inPosition) {            mPosition = inPosition;        }        @Override        public void onClick(View v) {            // TODO Auto-generated method stub            Toast.makeText(mContext, "被点击了-" + mPosition, Toast.LENGTH_SHORT).show();        }    }
  • 第二步在getview()方法中实现MyListener并得到他的对象。
 @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder viewHolder;        MyListener myListener = null;        if (null == convertView) {            myListener = new MyListener(position);
  • 在设置点击事件前要去设置button的标记位,为了让每个button拥有自己的位置。
    adapter的完整代码如下
package com.example.bankman.adapter;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import com.example.bankman.R;import java.util.List;public class ListAdapter extends BaseAdapter {    private Context mContext;    private List<String> mData;    public ListAdapter(Context context, List<String> data) {        mContext = context;        mData = data;    }    @Override    public int getCount() {        if (null != mData) {            return mData.size();        }        return 0;    }    @Override    public Object getItem(int position) {        return mData.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder viewHolder;        MyListener myListener = null;        if (null == convertView) {            myListener = new MyListener(position);            LayoutInflater view = LayoutInflater.from(mContext);            convertView = view.inflate(R.layout.item_list, parent, false);            viewHolder = new ViewHolder();            viewHolder.mButton = (Button) convertView.findViewById(R.id.item_button);            convertView.setTag(viewHolder);        } else {            viewHolder = (ViewHolder) convertView.getTag();        }        viewHolder.mButton.setText(mData.get(position));        //设置标记位置让每个条目的Button都记住自己的位置;        viewHolder.mButton.setTag(position);        viewHolder.mButton.setOnClickListener(myListener);        return convertView;    }    private class ViewHolder {        TextView mTextView;        Button mButton;    }    private class MyListener implements View.OnClickListener {        int mPosition;        public MyListener(int inPosition) {            mPosition = inPosition;        }        @Override        public void onClick(View v) {            // TODO Auto-generated method stub            Toast.makeText(mContext, "被点击了-" + mPosition, Toast.LENGTH_SHORT).show();        }    }}
0 0
原创粉丝点击