Scrollview+ListView冲突解决

最近作一个功能,要使用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来实现其余功能,方法仍是同样的。

相关文章
相关标签/搜索