listview中有button,强占条目的点击事件

来源:互联网 发布:恐怖视频制作软件 编辑:程序博客网 时间:2024/05/20 10:10
在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布局和自定义adapter了,一般是继承于BaseAdapter,示例代码见下方。写ListView的点击事件时OnItemClickListener,onItemClick方法没有执行,导致ListView中Item条目点击事件失效,而Item中的View点击事件可以在getView方法中进行处理。导致整个Item点击失效的原因多半是由于在你自己定义的Item中存在诸如ImageButton,Button,CheckBox等子控件(也可以说是Button或者Checkable的子类控件),此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应。

这时候就可以使用descendantFocusability来解决,其中descendantFocusability对应的属性有3个

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

属性的值有三种:

        beforeDescendants:viewgroup会优先其子类控件而获取到焦点

        afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

        blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

  解决方法

 1、通常我们用到的是第三种,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就好了。

       ps:有时我们的List也不想显示出分割线时,可以通过以下属性来设置:

[java] view plain copy
 print?
  1. android:divider="#00000000"    
  2. android:dividerHeight="0dip"   

  2、被点击的控件如ImageButton中添加属性android:focusable="false"

优化的listView代码写法

[java] view plain copy
 print?
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. import android.content.Context;  
  4. import android.view.LayoutInflater;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.view.ViewGroup;  
  8. import android.widget.BaseAdapter;  
  9. import android.widget.Button;  
  10. import android.widget.TextView;  
  11. import android.widget.Toast;  
  12.   
  13. public class MyAdapter extends BaseAdapter {  
  14.     private Context mContext;  
  15.     private List<ErrorDataBean> mList = new ArrayList<ErrorDataBean>();  
  16.   
  17.     public MyAdapter(Context mContext, List<ErrorDataBean> mList) {  
  18.         super();  
  19.         this.mContext = mContext;  
  20.         this.mList = mList;  
  21.     }  
  22.   
  23.     @Override  
  24.     public int getCount() {  
  25.         // TODO 自动生成的方法存根  
  26.         return mList.size();  
  27.     }  
  28.   
  29.     @Override  
  30.     public Object getItem(int position) {  
  31.         // TODO 自动生成的方法存根  
  32.         return mList.get(position);  
  33.     }  
  34.   
  35.     @Override  
  36.     public long getItemId(int position) {  
  37.         // TODO 自动生成的方法存根  
  38.         return position;  
  39.     }  
  40.   
  41.     @Override  
  42.     public View getView(int position, View convertView, ViewGroup parent) {  
  43.         final ViewHolder viewHolder;  
  44.         final int index=position;  
  45.         if (convertView == null) {  
  46.             viewHolder = new ViewHolder();  
  47.             convertView = LayoutInflater.from(mContext).inflate(  
  48.                     R.layout.list_item, null);  
  49.             viewHolder.tv1 = (TextView) convertView.findViewById(R.id.tv1);  
  50.             viewHolder.tv2 = (TextView) convertView.findViewById(R.id.tv2);  
  51.             viewHolder.tv3 = (TextView) convertView.findViewById(R.id.tv3);  
  52.             viewHolder.bt1 = (Button) convertView.findViewById(R.id.bt1);  
  53.             viewHolder.bt2 = (Button) convertView.findViewById(R.id.bt2);  
  54.               
  55.             convertView.setTag(viewHolder);  
  56.         } else {  
  57.             viewHolder = (ViewHolder) convertView.getTag();  
  58.         }  
  59.         // 用bean 来填充数据  
  60.         viewHolder.tv1.setText(mList.get(position).getErrorContent());  
  61.         viewHolder.tv2.setText(mList.get(position).getRightAns());  
  62.         viewHolder.tv3.setText(mList.get(position).getErrorSolution());  
  63.         viewHolder.bt1.setOnClickListener(new OnClickListener() {  
  64.   
  65.             @Override  
  66.             public void onClick(View v) {  
  67.                 // TODO 自动生成的方法存根  
  68.                 viewHolder.tv3.setText(mList.get(index).getErrorSolution());  
  69.                 Toast.makeText(mContext, "" + v.getId(), 0).show();  
  70.             }  
  71.         });  
  72.         viewHolder.bt2.setOnClickListener(new OnClickListener() {  
  73.   
  74.             @Override  
  75.             public void onClick(View v) {  
  76.                 // TODO 自动生成的方法存根  
  77.                 viewHolder.tv3.setText(mList.get(index).getErrorPrompt());  
  78.                 Toast.makeText(mContext, "" + v.getId(), 0).show();  
  79.             }  
  80.         });  
  81.         return convertView;  
  82.     }  
  83.   
  84.     final static class ViewHolder {  
  85.         TextView tv1, tv2,tv3;  
  86.         Button bt1, bt2;  
  87.     }  
  88. }  

有时一些代码段真的很容易忘记,比如常用的ScrollView嵌套listView的,要屏蔽listview的滑动

[java] view plain copy
 print?
  1. public class ListViewNoScroll extends ListView {  
  2.     public ListViewNoScroll(Context context) {  
  3.         super(context);  
  4.     }  
  5.   
  6.     public ListViewNoScroll(Context context, AttributeSet attrs) {  
  7.         super(context, attrs);  
  8.     }  
  9.   
  10.     @Override  
  11.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  12.         int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  
  13.                 MeasureSpec.AT_MOST);  
  14.         super.onMeasure(widthMeasureSpec, expandSpec);  
  15.     }  
  16.   
  17. }  
阅读全文
0 0
原创粉丝点击