解决ScrollView中嵌套ListView(本文为CornerListView)时显示异常的问题

  之前曾经就是做项目的时候,因为CornerListView的界面显示比较不错,所以经常用,但是突然发现嵌套在ScrollView中就会经常出现排布异常,很是苦恼的东西,两个不错的模块竟然无法存在,难道真的是“一山不容二货”,鱼与熊掌不可兼得?

  没办法,还是都想要,所以就想办法了!

  查资料,自己测试,终于有了解决方案!

首先看布局文件(不用变的):

 1  <com.example.car_fast.view.CornerListView
 2                     android:layout_marginTop="10dip"
 3                     android:layout_marginLeft="10dip"
 4                     android:layout_marginRight="10dip"
 5                     android:layout_marginBottom="10dip"
 6                     android:id="@+id/qiyejianjie_list"
 7                     android:layout_width="fill_parent"
 8                     android:layout_height="wrap_content"
 9                     android:background="@drawable/shape_bg_listview"
10                     android:layout_gravity="center"
11                     android:divider="#ff996699"
12                     android:dividerHeight="1dip"
13                     android:cacheColorHint="#00000000"
14                     android:listSelector="#00000000" />

接着就是具体的更改方案了:

首先,我们要做的是:

1.添加一个类Utility,在类中自定义一个全局的静态方法

setListViewHeightBasedOnChildren(ListView listView)

2.Utility.java 内容如下

package com.example.car_fast.dialog;

import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.ListView;

public class Utility {
        public static void setListViewHeightBasedOnChildren(ListView listView) {
    
        ListAdapter listAdapter = listView.getAdapter(); 
        if (listAdapter == null) {
            return;
        }
    
        int totalHeight = 0;
        for (int i = 0, len = listAdapter.getCount(); i < len; i++) 
        {   
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0);  
            totalHeight += listItem.getMeasuredHeight();  //统计所有子项的总高度
        }
    
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
    }
}

其次,先看原始代码(只写重要的部分吧):

//省略
//
adapter=new SimpleAdapter(Qiyejianjie.this,
                arrayList, R.layout.simple_list_item_1, new String[]{"title"}, new int[]{R.id.item_title});
        cornerListView.setAdapter(adapter);
        
        cornerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//
//省略

更改后的代码:

//省略
//
adapter=new SimpleAdapter(Qiyejianjie.this,
                arrayList, R.layout.simple_list_item_1, new String[]{"title"}, new int[]{R.id.item_title});
        cornerListView.setAdapter(adapter);
                    
        Utility.setListViewHeightBasedOnChildren(cornerListView);
        
        cornerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//
//省略    

只要结果,只要你稍微测试下,都是so easy的一件事儿!

方法,点到为止。

原文地址:https://www.cnblogs.com/cuixiaodong427/p/3103161.html