最近作一個功能,要使用Scrollview+Listview+ ListView,,通過找demo,找到了一個例子,本身也實現了一個例子來理解實現過程。先分享下,望你們指點、java
思路 :ide
如今又scrollview,一個上面的listView 咱們叫作topListView, 一個在下面的GridView 咱們叫作bottomListView, 我讓topListView重寫onMeasure()方法,讓topListView徹底顯示,再也不具備滾動功能。post
@Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }
這樣topListview和ScrollView衝突問題得以解決。spa
bottomListView和Scrollview和衝突咱們經過如下解決:咱們給tottomListView設置一個固定高度,這個高度每每是ScrollView顯示的高度,這樣解決了顯示的問題。code
post(new Runnable() { @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);
其次是滑動的衝突,衝突的關鍵是listView和Scrollview放在一塊兒時listVIew接收不到屏幕的touch事件,解決它。事件
咱們的解決方法是: 當Scrollview向上滾動時當滾動到topListView和bottom的分界點,即bottomListView滾動到屏幕頂端,咱們就主動將touch叫給bottomListView,因此上面代碼同時設置了topLIstView的高度。get
recommendGrid.setSwitchHeight(height2);
而後判斷 it
mScrollView.setOnMyScrollListener(new PullScrollView.OnMyScrollListener() { @Override public void onScroll(int l, int t, int oldl, int oldt) { if (recommendGrid.isOnTop()) { recommendGrid.setParentIdle(true); } else { recommendGrid.setParentIdle(false); } } });
其中 io
recommendGrid.setParentIdle();
用來設置父scrollView是否接收touch事件,true :不接收,即傳給子元素ListView,false : 相反,內部方法是:class
public void setParentIdle(boolean flag) { if (parentView != null) { parentView.requestDisallowInterceptTouchEvent(flag); } }
下滑時,須要將touch事件控制權再交給ScrollView,這時須要判斷,當bottom的第一個元素徹底展現出來時才能夠將控制權移交,
private boolean isFirstItemOnTop() { boolean flag = 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()); } return flag; }
ok,基本思路在這裏,具體代碼整理後在上傳,謝謝。
PS : 因爲topListView是徹底展現,因此getView()不會再被重用,且會重複執行不少次,因此不建議用來實現每一個itemView特別複雜的功能,其實上面徹底能夠將topListView替換掉,用任一ViewGroup來實現其餘功能,方法仍是同樣的。