listview中有button,强占条目的点击事件
2017-12-26 16:30
363 查看
在平常的开发过程中,我们的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也不想显示出分割线时,可以通过以下属性来设置:在平常的开发过程中,我们的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也不想显示出分割线时,可以通过以下属性来设置: print?android:divider="#00000000"
android:dividerHeight="0dip"
2、被点击的控件如ImageButton中添加属性android:focusable="false"优化的listView代码写法
[java] view plain copy print?import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MyAdapter extends BaseAdapter {
private Context mContext;
private List<ErrorDataBean> mList = new ArrayList<ErrorDataBean>();
public MyAdapter(Context mContext, List<ErrorDataBean> mList) {
super();
this.mContext = mContext;
this.mList = mList;
}
@Override
public int getCount() {
// TODO 自动生成的方法存根
return mList.size();
}
@Override
public Object getItem(int position) {
// TODO 自动生成的方法存根
return mList.get(position);
}
@Override
public long getItemId(int position) {
// TODO 自动生成的方法存根
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
final int index=position;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(
R.layout.list_item, null);
viewHolder.tv1 = (TextView) convertView.findViewById(R.id.tv1);
viewHolder.tv2 = (TextView) convertView.findViewById(R.id.tv2);
viewHolder.tv3 = (TextView) convertView.findViewById(R.id.tv3);
viewHolder.bt1 = (Button) convertView.findViewById(R.id.bt1);
viewHolder.bt2 = (Button) convertView.findViewById(R.id.bt2);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 用bean 来填充数据
viewHolder.tv1.setText(mList.get(position).getErrorContent());
viewHolder.tv2.setText(mList.get(position).getRightAns());
viewHolder.tv3.setText(mList.get(position).getErrorSolution());
viewHolder.bt1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
viewHolder.tv3.setText(mList.get(index).getErrorSolution());
Toast.makeText(mContext, "" + v.getId(), 0).show();
}
});
viewHolder.bt2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
viewHolder.tv3.setText(mList.get(index).getErrorPrompt());
Toast.makeText(mContext, "" + v.getId(), 0).show();
}
});
return convertView;
}
final static class ViewHolder {
TextView tv1, tv2,tv3;
Button bt1, bt2;
}
}
有时一些代码段真的很容易忘记,比如常用的ScrollView嵌套listView的,要屏蔽listview的滑动[java] view plain copy print?public class ListViewNoScroll extends ListView {
public ListViewNoScroll(Context context) {
super(context);
}
public ListViewNoScroll(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
android:dividerHeight="0dip"
2、被点击的控件如ImageButton中添加属性android:focusable="false"优化的listView代码写法
[java] view plain copy print?import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MyAdapter extends BaseAdapter {
private Context mContext;
private List<ErrorDataBean> mList = new ArrayList<ErrorDataBean>();
public MyAdapter(Context mContext, List<ErrorDataBean> mList) {
super();
this.mContext = mContext;
this.mList = mList;
}
@Override
public int getCount() {
// TODO 自动生成的方法存根
return mList.size();
}
@Override
public Object getItem(int position) {
// TODO 自动生成的方法存根
return mList.get(position);
}
@Override
public long getItemId(int position) {
// TODO 自动生成的方法存根
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
final int index=position;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(
R.layout.list_item, null);
viewHolder.tv1 = (TextView) convertView.findViewById(R.id.tv1);
viewHolder.tv2 = (TextView) convertView.findViewById(R.id.tv2);
viewHolder.tv3 = (TextView) convertView.findViewById(R.id.tv3);
viewHolder.bt1 = (Button) convertView.findViewById(R.id.bt1);
viewHolder.bt2 = (Button) convertView.findViewById(R.id.bt2);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 用bean 来填充数据
viewHolder.tv1.setText(mList.get(position).getErrorContent());
viewHolder.tv2.setText(mList.get(position).getRightAns());
viewHolder.tv3.setText(mList.get(position).getErrorSolution());
viewHolder.bt1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
viewHolder.tv3.setText(mList.get(index).getErrorSolution());
Toast.makeText(mContext, "" + v.getId(), 0).show();
}
});
viewHolder.bt2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
viewHolder.tv3.setText(mList.get(index).getErrorPrompt());
Toast.makeText(mContext, "" + v.getId(), 0).show();
}
});
return convertView;
}
final static class ViewHolder {
TextView tv1, tv2,tv3;
Button bt1, bt2;
}
}
有时一些代码段真的很容易忘记,比如常用的ScrollView嵌套listView的,要屏蔽listview的滑动[java] view plain copy print?public class ListViewNoScroll extends ListView {
public ListViewNoScroll(Context context) {
super(context);
}
public ListViewNoScroll(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
相关文章推荐
- listview中有button,强占条目的点击事件
- Android:处理ListView条目中的Button的点击事件和条目点击事件冲突
- Android中ListView的条目中有button时,item的点击事件失效
- Android基础:listview的item点击事件会使里面的Button也出现按压的效果
- ListView中的条目长按点击事件的实现
- 当listview的item的布局中有Button等可点击按钮时,item的点击事件与Button的点击事件处理
- Listview的条目点击事件失效(setOnItemClickedListener)
- 区分listview的item和Button的点击事件
- 区分listview的item和Button的点击事件
- 解决Android中Listview条目里面有checkbox、radiobutton无法响应条目点击事件
- Android下listview每个Item中包含有按钮,为什么在点击某一行按钮的时候,同时有多行button触发了响应事件?
- listview的子布局如果有HorizontalScrollView、CheckBox 、button,可能会导致onListItemClick点击事件失效。
- ListView中加入Button后,Button的点击事件和ListView的点击事件冲突
- ListView的Item中设置Button点击事件优化,避免重复new Listener
- Android小知识点、小疑问之 ListView中的灵异事件ListView跟Button 不能同时点击
- listview的onitemlongclick和onitemclick冲突,item中的button点击事件
- ListView中嵌入布局中有Button,如何响应Button点击事件
- 【Android】【UI】ListView中Button点击事件被拦截的解决方案
- 自定义CursorAdapter,实现ListView中动态加载button,和点击事件
- 从Listview与Button点击事件冲突看安卓点击事件分发机制