Android ListView与ScrollView冲突的解决方法总结
AndroidListView与ScrollView冲突的解决方法总结
众所周知ListView与ScrollView都具有滚动能力,对于这样的View控件,当ScrollView与ListView相互嵌套会成为一种问题:
问题一:ScrollView与ListView嵌套导致ListView显示不全面
问题二:ScrollView不能正常滑动
解决方式一:
ScrollView+LinearLayout+ListView可以换成ScrollView+LinearLayout+LinearLayout,对于开发中,ScrollView所能滚动的样式形式各异,另外的话,ScrollView所显示的内容肯定不会太多,因此这种方案是合理而且可选的
解决方式二:
同样是替换:ListView具有HeaderView与FooterView2部分,因此,在非下拉刷新,上拉加载的需求中,完全可以使用ListView来代替ScrollView,因此是合理可选的方案
解决方式三:
主动计算和设置ListView的高度,这样的结果最终得出类似解决方案一效果,具体来说缺点是大材小用,但也是合理的解决办法。
publicclassUtility{ publicstaticvoidsetListViewHeightBasedOnChildren(ListViewlistView){ ListAdapterlistAdapter=listView.getAdapter(); if(listAdapter==null){ return; } inttotalHeight=0; for(inti=0;i解决方式四:
复写ScrollView,从事件方向进行处理,缺点是灵活性不够好、
publicclassListScrollViewextendsScrollView{ privateListlist=newArrayList(); privateintscrollPaddingTop;//scrollview的顶部内边距 privateintscrollPaddingLeft;//scrollview的左侧内边距 privateint[]scrollLoaction=newint[2];//scrollview在窗口中的位置 privatefinalstaticintUPGLIDE=0; privatefinalstaticintDOWNGLIDE=1; privateintglideState; publicListScrollView(Contextcontext,AttributeSetattrs){ super(context,attrs); } privateintdownY=0; privateintmoveY=0; @Override publicbooleandispatchTouchEvent(MotionEventev){ switch(ev.getAction()){ caseMotionEvent.ACTION_DOWN: downY=(int)ev.getY(); //System.out.println("actiondown"+ev.getY()); break; caseMotionEvent.ACTION_MOVE: moveY=(int)ev.getY(); //System.out.println("move"+moveY+"down"+downY); if((moveY-downY)>=0){ //System.out.println("'''''''''DOWNGLIDE'''''''''''"); glideState=DOWNGLIDE; }else{ //System.out.println("'''''''''UPGLIDE'''''''''''"); glideState=UPGLIDE; } break; caseMotionEvent.ACTION_UP: default: break; } returnsuper.dispatchTouchEvent(ev); } @Override publicbooleanonInterceptTouchEvent(MotionEventev){ //该事件的xy是以scrollview的左上角为00点而不是以窗口为00点 intx=(int)ev.getX()+scrollLoaction[0]; inty=(int)ev.getY()+scrollLoaction[1]; for(inti=0;i=location[0]+scrollPaddingLeft &&x<=location[0]+scrollPaddingLeft+width &&y>=location[1]+scrollPaddingTop &&y<=location[1]+scrollPaddingTop+height){ //System.out.println(glideState); if(((listView.getLastVisiblePosition()==(listView.getCount()-1))&&(glideState==UPGLIDE))){ //System.out.println("up"); break; } if(((listView.getFirstVisiblePosition()==0)&&(glideState==DOWNGLIDE))){ //System.out.println("down"); break; } returnfalse;//让子控件直接处理 } } returnsuper.onInterceptTouchEvent(ev); } @Override publicbooleanonTouchEvent(MotionEventev){ returnsuper.onTouchEvent(ev); } privatevoidfindAllListView(Viewview){ if(viewinstanceofViewGroup){ intcount=((ViewGroup)view).getChildCount(); for(inti=0;i 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!