Android 中ScrollView嵌套GridView,ListView的实例

Android 中ScrollView嵌套GridView,ListView的实例,第1张

概述Android中ScrollView嵌套GridView,ListView的实例在Android开发中,经常有一些UI需要进行固定style的动态布局,然而由于现在的UI都喜欢把一个界面拉的很长,所以我们很多情况下需要使用ScrollView来嵌套列表控件来

AndroID 中ScrollVIEw嵌套GrIDVIEw,ListVIEw的实例

在AndroID开发中,经常有一些UI需要进行固定style的动态布局,然而由于现在的UI都喜欢把一个界面拉的很长,所以我们很多情况下需要使用ScrollVIEw来嵌套列表控件来实现UI。这样就导致了很多不顺心的问题。

问题一:列表控件显示不完全

原因是嵌套情况下,ScrollVIEw不能正确的计算列表控件的高度。

有两种解决方案

方案一

在适配器赋值完成后代码动态计算列表的高度。这里贴出ListVIEw的计算代码,GrIDVIEw的计算方式类似,不过需要考虑列数,下面代码没有加上列表控件padding的计算,如果你设置了这个属性,需要加上计算代码

public voID setListVIEwHeightBasedOnChildren(ListVIEw ListVIEw) {      // 获取ListVIEw对应的Adapter      listadapter listadapter = ListVIEw.getAdapter();      if (listadapter == null) {        return;      }      int totalHeight = 0;      for (int i = 0,len = listadapter.getCount(); i < len; i++) {        // listadapter.getCount()返回数据项的数目        VIEw ListItem = listadapter.getVIEw(i,null,ListVIEw);        // 计算子项VIEw 的宽高        ListItem.measure(0,0);        // 统计所有子项的总高度        totalHeight += ListItem.getMeasuredHeight();      }      VIEwGroup.LayoutParams params = ListVIEw.getLayoutParams();      params.height = totalHeight+ (ListVIEw.getdivIDerHeight() * (listadapter.getCount() - 1));      // ListVIEw.getdivIDerHeight()获取子项间分隔符占用的高度      // params.height最后得到整个ListVIEw完整显示需要的高度      ListVIEw.setLayoutParams(params);    }  

方案二

重写列表控件的onMeasure方法,这种方案不会出现列表控件本身的滚动条,并且vIEwholder复用机制会失效

@OverrIDe  public voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) {    int expandSpec = MeasureSpec.makeMeasureSpec(1 << 16,MeasureSpec.AT_MOST);    super.onMeasure(wIDthMeasureSpec,expandSpec);  }

方案一代码多,需要多次写,建议写成工具类方便调用;方案二在数据量大到不能一屏显示完的情况下会有性能问题,而且快速滑动的时候ScrollVIEw会不停的去计算列表控件的高度。贼影响绘制性能。
两种方案有利有弊,大家自己取舍

问题二:列表控件自动获取焦点,导致ScrollVIEw自动滚动到列表控件所在的位置

这个问题其实有很多种解决方案,归结起来是两种。

方案一

等待列表控件数据全部加载完成后(包括图片加载)调用ScrollVIEw.fullScroll(ScrollVIEw.FOCUS_UP);

方法让ScrollVIEw滚动到顶部。这个加载完成的时间不好控制,搞得不好会有滚动动画出现,很尴尬的事情。

方案二

重写列表控件的如下两个方法,使之固定返回false

@OverrIDe  public boolean isFocused() {    return false;  }  @OverrIDe  public boolean requestFocus(int direction,Rect prevIoUslyFocusedRect) {    return false;  }

两种方案的优缺点很明显,喔,第二种方案的缺点我目前没发现。如果你这么使用发现了什么坑,请留言告知

问题三 滑动冲突

这问题就更 *** 蛋了,根据UI的不同, *** 蛋程度也不同,涉及到vIEw的事件传递知识,很难给出所有情况的解决代码
解决起来也离不开几个要点,不过首先你得熟悉vIEw的事件传递

你需要根据情况决定重写列表控件与ScrollVIEw的如下几个方法,根据情况给方法返回不同的bool值来告诉控件是否拦截或者传递事件,需要哪个控件相应哪个方向的滚动事件就拦截哪个方向的事件传递,作为一个有追求的开发者,切记不要一通乱拦截

 @OverrIDe  public boolean ontouchEvent(MotionEvent ev) {    return super.ontouchEvent(ev);  }  @OverrIDe  public boolean onIntercepttouchEvent(MotionEvent ev) {    return super.onIntercepttouchEvent(ev);  }  @OverrIDe  public boolean dispatchtouchEvent(MotionEvent ev) {    return super.dispatchtouchEvent(ev);  }

给个小彩蛋

getParent().requestdisallowIntercepttouchEvent(boolean b);

这一句代码可以在子控件里决定是否让父容器获取事件

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

总结

以上是内存溢出为你收集整理的Android 中ScrollView嵌套GridView,ListView的实例全部内容,希望文章能够帮你解决Android 中ScrollView嵌套GridView,ListView的实例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146571.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存