ScrollView中嵌套ListView

来源:互联网 发布:外贸网络销售平台 编辑:程序博客网 时间:2024/05/29 16:14
第一种方法:

在计算listview总高度并设置

使用该方法需要注意:子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。

ScrollView下只能有一个字布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <ScrollView        android:layout_width="match_parent"        android:layout_height="match_parent" >        <LinearLayout            android:layout_width="match_parent"            android:layout_height="wrap_content" >            <ListView                android:id="@+id/listview"                android:layout_width="match_parent"                android:layout_height="wrap_content" >            </ListView>        </LinearLayout>    </ScrollView></LinearLayout>

item布局

子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView    android:id="@+id/text"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    ></TextView></LinearLayout>

MainActivity.java(红色为方法)

package com.bawei.day06_scrollview;import java.util.ArrayList;import java.util.List;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.View.MeasureSpec;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;import android.widget.ArrayAdapter;import android.widget.BaseAdapter;import android.widget.ListView;public class MainActivity extends Activity {    private ListView listView;    private List<String> list;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    listView = (ListView) findViewById(R.id.listview);    list = new ArrayList<String>();        for (int i = 0; i < 200; i++) {        list.add(i+"");    }        BaseAdapter adapter=new Adper(MainActivity.this,list);        listView.setAdapter(adapter);                }    //界面加载完  @Overridepublic void onWindowFocusChanged(boolean hasFocus) {    // TODO Auto-generated method stub    super.onWindowFocusChanged(hasFocus);    setListViewHeightBasedOnChildren(listView);}  public void setListViewHeightBasedOnChildren(ListView listView) {      //BaseAdapter为listview布局      BaseAdapter listAdapter = (BaseAdapter) listView.getAdapter();       if (listAdapter == null) {          return;      }             int totalHeight = 0;      for (int i = 0; i < listAdapter.getCount(); i++) {          View listItem = listAdapter.getView(i, null, listView);          if(listItem != null){              listItem.setLayoutParams(new LayoutParams(                      LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));              listItem.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);              totalHeight += listItem.getMeasuredHeight();          }      }      ViewGroup.LayoutParams params = listView.getLayoutParams();      params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1))               + listView.getPaddingTop() + listView.getPaddingBottom();      listView.setLayoutParams(params);  }    }

适配器

package com.bawei.day06_scrollview;import java.util.List;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class Adper extends BaseAdapter {    Context context;    List<String> list;    public Adper(Context context, List<String> list) {        // TODO Auto-generated constructor stub    this.context=context;    this.list=list;    }    public int getCount() {        // TODO Auto-generated method stub        return list.size();    }    public Object getItem(int position) {        // TODO Auto-generated method stub        return null;    }    public long getItemId(int position) {        // TODO Auto-generated method stub        return 0;    }    public View getView(int position, View convertView, ViewGroup parent) {        // TODO Auto-generated method stub        ViewHolder viewHolder;        if(convertView==null){        convertView=View.inflate(context, R.layout.listview, null);        viewHolder=new ViewHolder();        viewHolder.textView=(TextView) convertView.findViewById(R.id.text);        convertView.setTag(viewHolder);        }else{            viewHolder=(ViewHolder) convertView.getTag();        }        viewHolder.textView.setText(list.get(position));        return convertView;    }class ViewHolder{    TextView textView;}}

第二种方法

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <ScrollView        android:layout_width="match_parent"        android:layout_height="match_parent" >        <LinearLayout            android:layout_width="match_parent"            android:layout_height="wrap_content" >            <com.bawei.day06.ListViewForScrollView                android:id="@+id/listview"                android:layout_width="match_parent"                android:layout_height="wrap_content" >            </com.bawei.day06.ListViewForScrollView>        </LinearLayout>    </ScrollView></LinearLayout>

MainActivity.java

package com.bawei.day06;import java.util.ArrayList;import java.util.List;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.ArrayAdapter;import android.widget.BaseAdapter;import android.widget.ListView;public class MainActivity extends Activity {    private ListView listView;    private List<String> list;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listView = (ListView) findViewById(R.id.listview);        list = new ArrayList<String>();            for (int i = 0; i < 200; i++) {            list.add(i+"");        }            ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,list);                listView.setAdapter(adapter);    }    }

重写listview

ListViewForScrollView.java

package com.bawei.day06;import android.content.Context;import android.util.AttributeSet;import android.widget.ListView;public class ListViewForScrollView extends ListView {    public ListViewForScrollView(Context context, AttributeSet attrs) {        super(context, attrs);        // TODO Auto-generated constructor stub    }    @Override    /**     * 重写该方法,达到使ListView适应ScrollView的效果     */    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,                MeasureSpec.AT_MOST);        super.onMeasure(widthMeasureSpec, expandSpec);    }}

 

0 0