对于ScrollView内嵌ListView,我们需要解决两个问题。
1.ListView在layout_height为以下三种任何一种情况的时候,仅一个item可见的问题。
wrap_content
match_parent
0dp+ layout_weight = 1
解决方案:
1.给ListView设置固定height。
2.继承ListView重写onMeasure().如
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int size = MeasureSpec.getSize(heightMeasureSpec);
int mode = MeasureSpec.getMode(heightMeasureSpec);
Log.d(TAG, "onMeasure size = " + size + " mode = " + mode);
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 3, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec,expandSpec );
}
2.ListView内的元素无法滑动的问题。
解决方案
1 public class InnerListview extends ListView { 2 public InnerListview(Context context) { 3 super(context); 4 } 5 6 public InnerListview(Context context, AttributeSet attrs) { 7 super(context, attrs); 8 } 9 10 public InnerListview(Context context, AttributeSet attrs, int defStyle) { 11 super(context, attrs, defStyle); 12 13 } 14 15 @Override 16 public boolean onInterceptTouchEvent(MotionEvent ev) { 17 switch (ev.getAction()) { 18 // 当手指触摸listview时,让父控件交出ontouch权限,不能滚动 19 case MotionEvent.ACTION_DOWN: 20 setParentScrollAble(false); 21 case MotionEvent.ACTION_MOVE: 22 break; 23 case MotionEvent.ACTION_UP: 24 case MotionEvent.ACTION_CANCEL: 25 // 当手指松开时,让父控件重新获取onTouch权限 26 setParentScrollAble(true); 27 break; 28 29 } 30 return super.onInterceptTouchEvent(ev); 31 32 } 33 34 // 设置父控件是否可以获取到触摸处理权限 35 private void setParentScrollAble(boolean flag) { 36 getParent().requestDisallowInterceptTouchEvent(!flag); 37 } 38 39 }
http://blog.csdn.net/zhaokaiqiang1992/article/details/38585547