ScrollView包裹ListView的两种处理方法

来源:互联网 发布:牛顿环实验数据及 编辑:程序博客网 时间:2024/05/01 21:18
第一种:动态计算ListView的总高度并设置(注意:子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常

/**
 *此方法必须在ListView设置完Adapter之后使用(setAdapter方法之后调用)
 **/
 private 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();
  }

  ViewGroup.LayoutParams params = listView.getLayoutParams();
  params.height = totalHeight
    + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
  listView.setLayoutParams(params);
 }



第二种:自定义ListView,重载onMeasure()方法,设置全部显示

package com.meiya.ui;
import android.widget.ListView;
/**
*
* @Description: scrollview中内嵌listview的简单实现
*
* @File: ScrollViewWithListView.java
*
* @Paceage com.meiya.ui
*
*
* @Date 下午03:02:38
*
* @Version
*/
public class ScrollViewWithListView extends ListView {
    public ScrollViewWithListView(android.content.Context context,android.util.AttributeSet attrs) {
        super(context, attrs);
    }
    /**
    * 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);
    }
}


以上可以解决scrollView内嵌listView,但是有一个问题是第一次进入界面时动态加载listview的items后页面会跳转到listview的第一个子项,我们可以直接将ScrollView滚动到顶部 

scrollView.post(new Runnable() {  
      //让scrollview跳转到顶部,必须放在runnable()方法中
    @Override  
    public void run() {  
     scrollView.scrollTo(0, 0);  
     }  
  });
0 0
原创粉丝点击