Android 关于在ScrollView中加上一个ListView,ListView内容显示不完全(总是显示第一项)的问题的两种简单的解决方案

是这样的哈:

有这样一个需求:

  1.显示一个界面,界面上有一个列表(ListView),列表上面有一个可以滚动的海报。

  2.要求在ListView滚动的过程中,ListView上面的海报也可以跟着ListView滚动。

我们的一般解决方案:

1.使用ScrollView嵌套这一个ListView。

对,这样的布局本身是没哟什么问题的。但是问题来了,当你运行你的界面的时候,突然发现,你的列表中明明有好多项,但是为什么只显示一项呢?仔细检查你会发现,不是列表只显示一项,而是其它的项被布局本身遮住了。

怎么办呢?下面将给出两种相对简单的解决方案:

第一种:禁用ListView的滚动(Scroll)。

第二种:计算ListView中每一项的高度,然后根据每一项的高度“乘以”项数,计算出ListView的总高度。

下面给出第一种方法的代码展示:

import android.widget.ListView;

public class MyListView extends ListView{
    public MyListView(android.content.Context context,android.util.AttributeSet attrs){  
        super(context, attrs);  
    }  
    /** 
     * 设置不滚动 
     */  
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)  
    {  
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  
                MeasureSpec.AT_MOST);  
        super.onMeasure(widthMeasureSpec, expandSpec);  
  
    }  
}

以下是第二种方法的的代码:

/**动态改变listView的高度*/
    public void setListViewHeightBasedOnChildren(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(0, 0);
           totalHeight += listItem.getMeasuredHeight();
//           totalHeight += 80;
          }
          ViewGroup.LayoutParams params = listView.getLayoutParams();
//          params.height = 80 * (listAdapter.getCount() - 1);
//          params.height = 80 * (listAdapter.getCount());
          params.height = totalHeight
            + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
          ((MarginLayoutParams) params).setMargins(0, 0, 0, 0);
          listView.setLayoutParams(params);
          
         }


到此为止问题结束。如果哪位朋友有更好的解决办法,别忘了提出来分享一下哈。

原文地址:https://www.cnblogs.com/tony-yang-flutter/p/3344636.html