Scrollview+ListView冲突解决

2017-01-14 10:45:37来源:http://www.jianshu.com/p/1e43cd640075作者:Victor123人点击

最近做一个功能,要使用Scrollview+Listview+ ListView,,经过找demo,找到了一个例子,自己也实现了一个例子来理解实现过程。先分享下,望大家指点、

思路 :

现在又scrollview,一个上面的listView 我们叫做topListView, 一个在下面的GridView 我们叫做bottomListView, 我让topListView重写onMeasure()方法,让topListView完全显示,不再具有滚动功能。

@OverridepublicvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){intexpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >>2, MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}

这样topListview和ScrollView冲突问题得以解决。

bottomListView和Scrollview和冲突我们通过以下解决:我们给tottomListView设置一个固定高度,这个高度往往是ScrollView显示的高度,这样解决了显示的问题。

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);

其次是滑动的冲突,冲突的关键是listView和Scrollview放在一起时listVIew接收不到屏幕的touch事件,解决它。

我们的解决方法是: 当Scrollview向上滚动时当滚动到topListView和bottom的分界点,即bottomListView滚动到屏幕顶端,我们就主动将touch叫给bottomListView,所以上面代码同时设置了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();

用来设置父scrollView是否接收touch事件,true :不接收,即传给子元素ListView,false : 相反,内部方法是:

publicvoidsetParentIdle(booleanflag){if(parentView !=null) {        parentView.requestDisallowInterceptTouchEvent(flag);    }}

下滑时,需要将touch事件控制权再交给ScrollView,这时需要判断,当bottom的第一个元素完全展示出来时才可以将控制权移交,

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()不会再被重用,且会重复执行很多次,所以不建议用来实现每个itemView特别复杂的功能,其实上面完全可以将topListView替换掉,用任一ViewGroup来实现其他功能,方法还是一样的。




最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台