首先改變一下自己一成不變的android思想,所謂條條大路通羅馬圾旨,在確定需求的前提下毒租,我們需要考慮好自己的最優(yōu)布局,怎樣實現(xiàn)最簡單词疼,UI渲染的效率最高,那我們就確定怎樣的布局帘腹;
下圖這個布局要求名稱這一豎列在左右滑動的時候固定,從“最新”開始可以往左滑動许饿,并且滬鋁1阳欲,2,3....是滬鋁連續(xù)的子view陋率;
我最開始考慮的布局是使用一個ExpandableListView球化,同時標(biāo)題(名稱,最新瓦糟。筒愚。)為一個自定義的HorizontalScrollView,滑動的時候可以和ExpandableListView聯(lián)動菩浙,效果是實現(xiàn)了巢掺,但是由于ExpandableListView的每一個item都是一個自定義的HorizontalScrollView布局,每次滑動便是屏幕上所顯示的所有item劲蜻,也就是一屏幕的HorizontalScrollView在滑動陆淀,這樣就導(dǎo)致在左右滑動的時候特別卡頓,最終不得不放棄先嬉。轧苫。。疫蔓。返工含懊;
-----------------------------------------------重點--------------------------------------------------------
經(jīng)過再三考慮,決定布局大換血
布局A我采用一個ExpandableListView衅胀,同樣岔乔,布局C也采用一個ExpandableListView(設(shè)置寬度為標(biāo)題欄的總寬度),標(biāo)題欄包括布局C用一個自定義的HorizontalScrollView包裹拗小,可以滑動的寬度就是標(biāo)題欄的總寬度重罪;
Question1.
那么如此的話我要解決的第一個問題便是 如何滑動右側(cè)ExpandableListView的時候同時帶動左側(cè)的聯(lián)動,并且是相同距離的聯(lián)動,右側(cè)也一樣需要聯(lián)動,下面貼出代碼剿配,互相學(xué)習(xí)指正搅幅;
Question2.
聯(lián)動實現(xiàn)之后遇到了第二個問題,由于外面的父布局是一個viewPager嵌套多個fragment滑動呼胚,所以當(dāng)我左右滑動listview的時候?qū)е聉iewpager并不能靈活切換茄唐,顯然這個是事件的分發(fā)和消費機制問題,隧道式向下分發(fā)蝇更,冒泡式向上處理沪编,想起了當(dāng)年老師總結(jié)的規(guī)律,于是在右側(cè)listview外層的自定義HorizontalScrollView中重寫了dispatchTouchEvent方法
requestDisallowInterceptTouchEvent 是ViewGroup類的一個方法年扩,它的參數(shù)是boolean值蚁廓,由字面意思可知,它的作用是要求不允許攔截觸摸事件厨幻,要求誰呢相嵌?當(dāng)時是父容器,通過getParent()方法獲取父容器的實例况脆,然后調(diào)用requestDisallowInterceptTouchEvent()阻止父容器攔截點擊事件
這樣通過改變后的大換血布局饭宾,整個頁面沒有再出現(xiàn)卡頓的現(xiàn)象,viewPager之間的切換也很流暢
下面這段代碼是左右兩側(cè)的listView同時展開 格了,同時閉合看铆,且只展開一列的聯(lián)動代碼
private void? setBothExpandListView() {
mLeftListView.setOnGroupClickListener(newExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent,View v, intgroupPosition, longid) {
if(mLeftListView.isGroupExpanded(groupPosition)) {
mRightListView.collapseGroup(groupPosition);
}else{
mRightListView.expandGroup(groupPosition);
}
return false;
}
});
mRightListView.setOnGroupClickListener(newExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent,View v, intgroupPosition, longid) {
if(mRightListView.isGroupExpanded(groupPosition)) {
mLeftListView.collapseGroup(groupPosition);
}else{
mLeftListView.expandGroup(groupPosition);
}
return false;
}
});
mLeftListView.setOnGroupExpandListener(newExpandableListView.OnGroupExpandListener() {
@Override
public void onGroupExpand(intgroupPosition) {
for(inti =0;i
if(i != groupPosition &&mLeftListView.isGroupExpanded(i)) {
mLeftListView.collapseGroup(i);
}
}
}
});
mRightListView.setOnGroupExpandListener(newExpandableListView.OnGroupExpandListener() {
@Override
public void onGroupExpand(intgroupPosition) {
for(inti =0;i
if(i != groupPosition &&mRightListView.isGroupExpanded(i)) {
mRightListView.collapseGroup(i);
}
}
}
});
}