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
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!