在实际项目中,我们通常回遇到Scroll嵌套listview,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.youkuaiyun.com/detail/zhang106209/9632844
wwo