最近做一個(gè)功能,要使用Scrollview+Listview+ ListView鳞溉,,經(jīng)過(guò)找demo,找到了一個(gè)例子鼠哥,自己也實(shí)現(xiàn)了一個(gè)例子來(lái)理解實(shí)現(xiàn)過(guò)程熟菲。先分享下,望大家指點(diǎn)朴恳、
思路 :
現(xiàn)在又scrollview抄罕,一個(gè)上面的listView 我們叫做topListView, 一個(gè)在下面的GridView 我們叫做bottomListView, 我讓topListView重寫(xiě)onMeasure()方法,讓topListView完全顯示于颖,不再具有滾動(dòng)功能呆贿。
@OverridepublicvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){intexpandSpec?=?MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE?>>2,?MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec,?expandSpec);}
這樣topListview和ScrollView沖突問(wèn)題得以解決。
bottomListView和Scrollview和沖突我們通過(guò)以下解決:我們給tottomListView設(shè)置一個(gè)固定高度,這個(gè)高度往往是ScrollView顯示的高度做入,這樣解決了顯示的問(wèn)題冒晰。
post(newRunnable()?{????@Override????public?void?run()?{????????int?height?=?mScrollView.getHeight();int?height2?=?topLayout.getHeight();Log.i("TEST","?post?--->?height?:?"+?height);Log.i("TEST","?post?--->?height2?:?"+?height2);Log.i("TEST","?post?--->?getHeight?:?"+?rootView.getHeight());recommendGrid.getLayoutParams().height?=?height;recommendGrid.setSwitchHeight(height2);recommendGrid.invalidate();mScrollView.invalidate();}},200);
其次是滑動(dòng)的沖突,沖突的關(guān)鍵是listView和Scrollview放在一起時(shí)listVIew接收不到屏幕的touch事件竟块,解決它壶运。
我們的解決方法是: 當(dāng)Scrollview向上滾動(dòng)時(shí)當(dāng)滾動(dòng)到topListView和bottom的分界點(diǎn),即bottomListView滾動(dòng)到屏幕頂端浪秘,我們就主動(dòng)將touch叫給bottomListView蒋情,所以上面代碼同時(shí)設(shè)置了topLIstView的高度。
recommendGrid.setSwitchHeight(height2);
然后判斷
mScrollView.setOnMyScrollListener(newPullScrollView.OnMyScrollListener()?{@OverridepublicvoidonScroll(intl,intt,intoldl,intoldt){if(recommendGrid.isOnTop())?{????????????recommendGrid.setParentIdle(true);????????}else{????????????recommendGrid.setParentIdle(false);????????}????}});
其中
recommendGrid.setParentIdle();
用來(lái)設(shè)置父scrollView是否接收touch事件耸携,true :不接收棵癣,即傳給子元素ListView,false : 相反夺衍,內(nèi)部方法是:
publicvoidsetParentIdle(booleanflag){if(parentView?!=null)?{????????parentView.requestDisallowInterceptTouchEvent(flag);????}}
下滑時(shí)浙巫,需要將touch事件控制權(quán)再交給ScrollView,這時(shí)需要判斷刷后,當(dāng)bottom的第一個(gè)元素完全展示出來(lái)時(shí)才可以將控制權(quán)移交,
privatebooleanisFirstItemOnTop(){booleanflag?=?getFirstVisiblePosition()?==0&&?getChildCount()?>0&&?getChildAt(0).getTop()?>=0;????Log.d("TEST","?isFirstItemOnTop?--->?getFirstVisiblePosition?:?"+?(getFirstVisiblePosition()?==0));if(getChildCount()?>0)?{????????Log.d("TEST","?isFirstItemOnTop?--->?getChildAt(0).getTop()?:?"+?getChildAt(0).getTop());????}returnflag;}
ok,基本思路在這里渊抄,具體代碼整理后在上傳尝胆,謝謝。
PS :? ?由于topListView是完全展示护桦,所以getView()不會(huì)再被重用含衔,且會(huì)重復(fù)執(zhí)行很多次,所以不建議用來(lái)實(shí)現(xiàn)每個(gè)itemView特別復(fù)雜的功能二庵,其實(shí)上面完全可以將topListView替換掉贪染,用任一ViewGroup來(lái)實(shí)現(xiàn)其他功能,方法還是一樣的催享。