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

2017-02-17 21:12

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();
            }
    
        }
    }