按照android的标准,ScrollView中是不能嵌套具有滑动特性的View的,但是有时如果设计真的有这样做的需要,或者为了更方便简单的实现外观(比如在外在的大布局需要有滑动的特性,并且内部有类似于List的UI结构,那么ListView + Adpater的方式来实现里面的效果就很方便,算是违规抄近道的一种方式吧),有时就会不得不采用这种怪异的组合方式。

先说下这种方式如果不做特殊处理时会出现的冲突和问题:

1,在SrollView中嵌套ListView,ListView的显示会有问题,只显示一行或显示效果与预期不同,这是因为android禁止这样使用,放入ScrollView中的ListView的高度是无法计         算的。

2,嵌套中的子ListView和GridvIew是无法滑动的,因为子控件的滑动事件会被外面的ScrollView吃掉,如果想让子控件可以滑动,只能强行的截取滑动的相关事件了。

言归正传,嵌套的解决方案:

1,第一种方案,也是我比较推荐的方案,就是重写ListView与GridView,让其失去滑动特性:

package com.perfect.xiaoao.all.ui;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.GridView; /**
* Created by IntelliJ IDEA.
* User: zhUser
* Date: 13-1-24
* Time: 下午6:53
*/
public class NoScrollGridView extends GridView{ public NoScrollGridView(Context context, AttributeSet attrs){
super(context, attrs);
} public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, mExpandSpec);
}
} package com.perfect.xiaoao.all.ui; import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView; /**
* Created by IntelliJ IDEA.
* User: zhUser
* Date: 13-1-24
* Time: 下午6:53
*/
public class NoScrollListView extends ListView{ public NoScrollListView(Context context, AttributeSet attrs){
super(context, attrs);
} public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, mExpandSpec);
}
}

2,第二种方案,也是网上流行的一种解决办法,人工计算子控件的尺寸,解决办法:

在listview.setAdapter()之后调用Utility.setListViewHeightBasedOnChilren(listview)就Okay 了。

public class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
//获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
} int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) { //listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0); //计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); //统计所有子项的总高度
} ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
//listView.getDividerHeight()获取子项间分隔符占用的高度
//params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
}

原理就是:设置完ListView的Adapter后,根据ListView的子项目重新计算ListView的高度,然后把高度再作为LayoutParams设置给ListView,这样它的高度就正确了,通过人工算取控件的应有高度,再设置给ListView

注意:这个方案中子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。

最后,建议大家还是少用这样的设计,毕竟这种方式是不标准与不规范的。

最新文章

  1. 【131202】SQL
  2. LeetCode &quot;Valid Perfect Square&quot;
  3. 使用gulp插件来自动刷新页面。
  4. JPA EntityManager详解(一)
  5. R 环境内存限制的更改
  6. eclipse无法与手机连上的解决方案
  7. sed 常见用法
  8. 在阿里云服务器ubuntu14.04运行netcore
  9. Java 多线程之龟兔赛跑(文件夹——读取文件——时间)
  10. 当tomcat有两个链接数据库的应用同时运行可能冲突
  11. 笔试题引出float数据的存储方式的深究
  12. TensorFlow框架之Computational Graph详解
  13. python 类继承演示范例的代码
  14. Android ble蓝牙问题
  15. 输入框VS软键盘
  16. scrollIntoView() 调用元素就可以出现在视窗中
  17. 面试集——redis
  18. 【1】[leetcode-124] 二叉树中的最大路径和
  19. c++关键字static的作用
  20. apache 运行一段时间出现错误

热门文章

  1. [Apio2012]dispatching 左偏树做法
  2. 分布式监控工具Ganglia 介绍 与 集群部署.
  3. Android手机间无线互传功能探索及实现
  4. 【配置】Spring和MyBatis整合
  5. PyTorch学习系列(九)——参数_初始化
  6. urb传输的代码分析【转】
  7. struct termios结构体详解
  8. MySQL多源复制【转】
  9. 如何将IOS版本的更新下载文件指向到自己的服务器
  10. 修改MySQL的时区,涉及参数time_zone