ScrollView与listview的冲突问题汇总
两种滑动布局嵌套的时候会出现只能显示第一行,还有滑动事件冲突问题。SrcollView嵌套ListView、GridView,ListView嵌套ListView对于这情况。
解决办法一:出现这种布局,而且对于数据量都不会很大,这样重写ListView的onMeasure方法就可以了,让ListView的高度足够把所有的item都显示出来。
自定义:
MeasureSpec 有三种模式 由2进制的前两位来控制
MeasureSpec.EXACTLY:尺寸的值是多少,那么这个组件的长或宽就是多少。
MeasureSpec.AT_MOST:父组件有多大的空间就可以占多大空间。
MeasureSpec.UNSPECIFIED:可以随便用空间 不受限制。
public class Kescrlistview extends ListView {
public Kescrlistview(Context context) {
super(context);
}
public Kescrlistview(Context context, AttributeSet attrs) {
super(context, attrs);
}
public Kescrlistview(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
/**
* 重写该方法,达到使ListView适应ScrollView的效果
*/
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
解决办法二:
如果只是顶部布局需要和列表一起滑动,ListView具有HeaderView与FooterView2部分,因此,在非下拉刷新,上拉加载的话,可以使用ListView来代替ScrollView。
解决办法三:
主动计算和设置ListView的高度,感觉比较麻烦,不建议使用,代码如下:
public class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}
解决办法四:用到事件拦截机制事件的处理和传递,可以通过父View进行拦截,在事件冲突上
ScrollView 设置 android:fillViewport="true"
在listView的onTouch里面拦截ScrollView的事件,使得scrollView不可以获得点击事件,这样只有listView获得点击事件!
listview.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
scrollview.requestDisallowInterceptTouchEvent(true);
return false;
}
});