完美解决ListView 与 ScrollView 共存问题

1:首先设置ListView的高度,在setAdapter之后调用此方法。

public static void setListViewHeightBasedOnChildren(ListView listView) {

        ListAdapter listAdapter = listView.getAdapter();

        if (listAdapter == null) {

               return;

        }

        

        int totalHeight = 0;

        int len = listAdapter.getCount();

        for (int i = 0; i < len; i++) {   

               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.setLayoutParams(params);

    }

2:如果ListView中的数据是单行的以上代码没有问题,如果Item行数不固定则要重写ListView的onMeasure方法重新计算每个Item的高度。

public class WListView  extends ListView{



    public WListView(Context context) {

        super(context);

        // TODO Auto-generated constructor stub

    }



    public WListView(Context context, AttributeSet attrs, int defStyle) {

        super(context, attrs, defStyle);

        // TODO Auto-generated constructor stub

    }



    public WListView(Context context, AttributeSet attrs) {

        super(context, attrs);

        // TODO Auto-generated constructor stub

    }

    

    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        //根据模式计算每个child的高度和宽度

        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,

                MeasureSpec.AT_MOST);

        super.onMeasure(widthMeasureSpec, expandSpec);

    }

}

这样就解决了。

在使用的时候通过多态的方式进行。例如:

(1) activity_xxsd.xml

<com.wzh.view.WListView
android:background="@drawable/xxsd_content_bg"
android:id="@+id/lvXxsdZxtzTitles"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

(2) XxsdActivity.java

private ListView lvXxsdZxtzTitles = null;

...

lvXxsdZxtzTitles=(WListView)findViewById(R.id.lvXxsdZxtzTitles);

 

你可能感兴趣的:(scrollview)