ScrollView 与ListView 一起使用导致的滑动冲突

ScrollView常用来布局一个内容超过当前页面,需要往下滑才能看到完整内容。可以把ScrollView看作是一种特殊的、加长版的LinearLayout,系统在加载布局时其实要知道整个布局的长度,才能将整个页面显示出来。而ListView的item个数是会动态变化的,如果在ScrollView中加入ListView会让系统无法准确加载,导致ListView只显示一行。

以下的方法可以ScrollView和ListView一起使用导致ListView只显示一行的问题。

解决方法

方法一:
根据ListView中Item数量,动态计算出ListView的总高度,使全部item得到显示。部分代码如下:

 /**
  * 通过ListView Item数量计算出ListView的总高度
  */
public static void setListViewHeight(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        return;
    }
    int totalHeight = 0;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        listItem.measure(1, 1);
        totalHeight += listItem.getMeasuredHeight();
    }
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)) + listView.getPaddingTop() + listView.getPaddingBottom();
    listView.setLayoutParams(params);
}

方法二:自定义 一个AppListView 继承ListView ,重写里面的onMeasure()方法。

/**
* 如果不设置Integer.MAX_VALUE >> 2,系统默认设置是显示两条
*/
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, expandSpec);
}

发表回复

后才能评论