Scrollview+ListView冲突解决

作者: Victor123 | 来源:发表于2016-08-14 16:28 被阅读228次

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

相关文章

  • Scrollview+ListView冲突解决

    最近做一个功能,要使用Scrollview+Listview+ ListView,,经过找demo,找到了一个例子...

  • 深入解析Android Design包——NestedScrol

    Android开发中滑动冲突的问题一直是编写界面时的一个老大难问题,比如ScrollView+ListView的嵌...

  • Scrollview+listview替代方案

    Scrollview+listview的不足 最近在做项目的时候,发现在使用scrollview+listview...

  • 疗愈是什么?

    找到旧伤和自己和解. 解决冲突轻松活 发了问题解决冲突 解决冲突痛快活着 通过决察发现问题解决冲突和自己和解痛快活...

  • 与冲突和解

    生活中处处有冲突。 然而,有效的冲突技巧往往能合理的解决冲突与人际关系。 《解决冲突的关键技巧》...

  • (4.2) git分支管理-解决冲突

    小结 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。 解决冲突就是把Git合并失败...

  • 冲突

    冲突产生需求 洞察冲突的源头 然后解决冲突 而我们要制造冲突

  • 解决冲突

    git命令行解决冲突文件步骤2018年01月19日 14:47:01阅读数:4118方法一(推荐使用): git ...

  • 解决冲突

    1、解决冲突 2、更新到指定版本 选中其中一个版本后点击ok即可。 原文:https://blog.csdn.ne...

  • 解决冲突

    阅读: 598668 人生不如意之事十之八九,合并分支往往也不是一帆风顺的。 准备新的feature1分支,继续我...

网友评论

    本文标题:Scrollview+ListView冲突解决

    本文链接:https://www.haomeiwen.com/subject/xnbysttx.html