天天看点

解决ScrollView嵌套ListView问题的三种方法

在实际项目中,我们通常回遇到Scroll嵌套listview,listview显示不全的问题,有以下三种方案,推荐使用第三种;

项目截图:

解决ScrollView嵌套ListView问题的三种方法
解决ScrollView嵌套ListView问题的三种方法

方案一:手动设置listview的高度

1.布局文件:first.xml

<?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">

    <ScrollView
        android:id="@+id/scroll_first"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginTop="10dp"
                android:textSize="25sp"
                android:text="方案一"/>
            <ListView
                android:id="@+id/listView_first"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                 >
            </ListView>
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:textSize="25sp"
                android:text="下面数据"
            />
        </LinearLayout>

    </ScrollView>

</LinearLayout>
           

2.动态设置listview的高度的类: Utitily

package com.zhw.scrollviewdemo.weight;

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

/**
 * 动态设置ListView的高度
 */
public class Utitily {

        public static void setListViewHeightBasedOnChildren(ListView listView) {
            //获取ListView对应的Adapter
            ListAdapter listAdapter = listView.getAdapter();
            if (listAdapter == null) {
                // pre-condition
                return;
            }

            int totalHeight = 0;
            for (int i = 0, len = listAdapter.getCount(); i < len; i++) {   //listAdapter.getCount()返回数据项的数目
                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.getDividerHeight()获取子项间分隔符占用的高度
            //params.height最后得到整个ListView完整显示需要的高度
            listView.setLayoutParams(params);
        }


}
           

3.FirstActivity

package com.zhw.scrollviewdemo.ui;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;

import com.zhw.scrollviewdemo.R;
import com.zhw.scrollviewdemo.adapter.FirstAdapter;
import com.zhw.scrollviewdemo.vo.firstVo;
import com.zhw.scrollviewdemo.weight.Utitily;

import java.util.ArrayList;
import java.util.List;

/**
 * 方案一
 */
public class FirstActivity extends Activity{

    private ListView listView;
    private FirstAdapter fAdapter;
    private List<firstVo>list=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first);
        listView= (ListView) findViewById(R.id.listView_first);
        initData();



    }

    /**
     * 准备数据
     */
    private void initData(){
        List<firstVo>data=new ArrayList<>();
        for (int i=0;i<20;i++){
            firstVo vo=new firstVo();
            vo.setName("item"+i);
            data.add(vo);
        }
        list.clear();
        list.addAll(data);
        Log.i("info","initData==="+list);
        fAdapter=new FirstAdapter(list,this);
       <span style="color:#ff0000;"> listView.setAdapter(fAdapter);
        Utitily.setListViewHeightBasedOnChildren(listView);</span>
    }
}
           

4.FirstAdapter

package com.zhw.scrollviewdemo.adapter;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.zhw.scrollviewdemo.R;
import com.zhw.scrollviewdemo.vo.firstVo;

import java.util.List;

/**
 * 方案一的适配器
 */
public class FirstAdapter extends BaseAdapter {

    private Context mContext;
    private List<firstVo> data;

    public FirstAdapter(List<firstVo> data, Context mContext) {
        this.data = data;
        this.mContext = mContext;
    }

    @Override
    public int getCount() {
        Log.i("info","getCount=="+ data.size());
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {

        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder mHolder;
        if (convertView==null){
            convertView= LayoutInflater.from(mContext).inflate(R.layout.list_item,null);

            mHolder=new ViewHolder();

            mHolder.textView= (TextView) convertView.findViewById(R.id.textView);

            convertView.setTag(mHolder);
        }else{
            mHolder= (ViewHolder) convertView.getTag();
        }

        firstVo fir=data.get(position);
        Log.i("info","data=="+data.get(position)+position);
        mHolder.textView.setText(fir.getName());

        return convertView;
    }

    class ViewHolder{
        TextView textView;
    }
}
           

方案二:使用单个ListView取代ScrollView中所有内容

1.two.xml

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

</LinearLayout>
           

2.TwoActivity

package com.zhw.scrollviewdemo.ui;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;

import com.zhw.scrollviewdemo.R;
import com.zhw.scrollviewdemo.adapter.TwoAdapter;
import com.zhw.scrollviewdemo.vo.firstVo;
import java.util.ArrayList;
import java.util.List;

/**
 * 方案二
 */
public class Twoctivity extends Activity{

    private ListView listView;
    private List<firstVo>list=new ArrayList<>();
    private TwoAdapter twoAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.two);

        listView= (ListView) findViewById(R.id.listview_two);
        initData();
    }

    /**
     * 准备数据
     */
    private void initData(){
        List<firstVo> data=new ArrayList<>();
        for (int i=0;i<20;i++){
            firstVo vo=new firstVo();
            vo.setName("item"+i);
            data.add(vo);
        }
        list.clear();
        list.addAll(data);
        Log.i("info","initData==="+list);
        twoAdapter=new TwoAdapter(this,list);
        listView.setAdapter(twoAdapter);

    }
}
           

3.TwoAdapter

package com.zhw.scrollviewdemo.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.zhw.scrollviewdemo.R;
import com.zhw.scrollviewdemo.vo.firstVo;
import java.util.List;

/**
 * 方案二的适配器
 */
public class TwoAdapter extends BaseAdapter {

    private Context mContext;
    private List<firstVo> data;

    public TwoAdapter(Context mContext, List<firstVo> data) {
        this.data = data;
        this.mContext = mContext;
    }
    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        if(position == 0){
            convertView = LayoutInflater.from(mContext)
                    .inflate(R.layout.two_list_item01, null);
            return convertView;
        }
        //列表最后一项
        else if(position == 19){
            convertView = LayoutInflater.from(mContext)
                    .inflate(R.layout.two_list_item03, null);
            return convertView;
        }

        ViewHolder viewHolder;
        if (convertView == null || convertView.getTag() == null){
            convertView = LayoutInflater.from(mContext)
                    .inflate(R.layout.two_list_item02, null);
            viewHolder=new ViewHolder();
            viewHolder.textView= (TextView) convertView.findViewById(R.id.two_textView);

            convertView.setTag(viewHolder);
        }else{
            viewHolder= (ViewHolder) convertView.getTag();
        }

        firstVo fir=data.get(position);

        viewHolder.textView.setText(fir.getName());
        return convertView;


    }

    class ViewHolder{
        TextView textView;
    }
}
           

方案三:自定义可适应ScrollView的ListView(推荐:自定义的listview)

1.four.xml

<?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">

    <ScrollView
        android:id="@+id/scroll_four"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_marginTop="10dp"
                android:textSize="25sp"
                android:text="方案一"/>

            <com.zhw.scrollviewdemo.weight.MyListView
                android:id="@+id/listView_four"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
            </com.zhw.scrollviewdemo.weight.MyListView>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:textSize="25sp"
                android:text="下面数据"
            />

        </LinearLayout>


    </ScrollView>

</LinearLayout>
           

2.自定义的 listview

package com.zhw.scrollviewdemo.weight;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

/**
 *自定义的listview
 */
public class MyListView extends ListView{

    public MyListView(Context context) {
        super(context);
    }
    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public MyListView(Context context, AttributeSet attrs,
                                 int defStyle) {
        super(context, attrs, defStyle);
    }
    @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);
    }
}
           

3.FourActivity

package com.zhw.scrollviewdemo.ui;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ScrollView;

import com.zhw.scrollviewdemo.R;
import com.zhw.scrollviewdemo.adapter.FirstAdapter;
import com.zhw.scrollviewdemo.vo.firstVo;
import com.zhw.scrollviewdemo.weight.MyListView;

import java.util.ArrayList;
import java.util.List;

/**
 * 方案三
 */
public class FourActivity extends Activity{

    private MyListView listView;
    private FirstAdapter fAdapter;
    private List<firstVo>list=new ArrayList<>();
    private ScrollView scrollView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.four);
        listView= (MyListView) findViewById(R.id.listView_four);
        scrollView= (ScrollView) findViewById(R.id.scroll_four);
        scrollView.smoothScrollTo(0,0);
        initData();
    }
    /**
    * 准备数据
    */
    private void initData(){
        List<firstVo> data=new ArrayList<>();
        for (int i=0;i<20;i++){
            firstVo vo=new firstVo();
            vo.setName("item"+i);
            data.add(vo);
        }
        list.clear();
        list.addAll(data);
        Log.i("info","initData==="+list);
        fAdapter=new FirstAdapter(list,this);
        listView.setAdapter(fAdapter);
    }
}
           

完整的demo下载地址:http://download.csdn.net/detail/zhang106209/9632844

wwo 

继续阅读