我們?cè)谑褂肧crollView有時(shí)會(huì)內(nèi)嵌ListView并闲,但是ListView只能顯示一個(gè)Item无埃。這是因?yàn)镾crollView的重寫了measureChildWithMargins方法導(dǎo)致它的子View的高度被強(qiáng)制設(shè)置成了MeasureSpec.UNSPECIFIED模式鹦付。MeasureSpec.UNSPECIFIED是什么東東呢屎即,我們就介紹一下吧贡翘。
MeasureSpec.UNSPECIFIED
不限定蚜厉,父View不限制子View的具體的大小长已,所以子View可以按自己需求設(shè)置寬高(前面說的ScrollView就給子View設(shè)置了這個(gè)模式,ListView就會(huì)自己確認(rèn)自己高度)昼牛。
MeasureSpec.EXACTLY
父View決定子View的確切大小术瓮,子View被限定在給定的邊界里,忽略本身想要的大小贰健。
MeasureSpec.AT_MOST
最多的胞四,子View最大可以達(dá)到的指定大小(當(dāng)設(shè)置為wrap_content時(shí)伶椿,模式為AT_MOST, 表示子view的大小最多是多少辜伟。)
看列表我們只需將MeasureSpec.UNSPECIFIED氓侧,強(qiáng)制改成MeasureSpec.AT_MOST或者M(jìn)easureSpec.EXACTLY就好了。知道是什么原因引起导狡,那么接下來就好辦了约巷。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(500,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
現(xiàn)在顯示是正確了,但是還是無法監(jiān)聽ListView的滑動(dòng)事件旱捧。這是怎么回事呢独郎,原來呀ScrollView和ListView的滑動(dòng)沖突了,ScrollView的攔截了滑動(dòng)事件。
那么我們?cè)谌绾谓鉀Q呢廊佩?在事件分發(fā)中有一個(gè)requestDisallowInterceptTouchEvent方法可以在子View中干預(yù)父元素的分發(fā)過程囚聚。代碼如下:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.d("list ev action",ev.getAction()+"");
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
getParent().requestDisallowInterceptTouchEvent(false);
break;
}
boolean isIntercept = super.onInterceptTouchEvent(ev);
Log.d("list isIntercept",isIntercept+"");
return true;
}