ScrollView包含ListView出现的显示不全
关于这个问题,其实有很多网上有很多种解决方法,这里是计算了
ListView的高度。
公式:listView总高度=(每个Item的内容高度条目数量)+(每条分割线高度(条目数量-1))+上下填充高度
- 首先创建自定义View类继承ListView
代码如下
package com.example.myandroid_test_listview;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ListView;
public class MyListView extends ListView {
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
}
- 在XML布局文件中
<ScrollView 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"
>
<com.example.myandroid_test_listview.MyListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</ScrollView>
- 在activity中带如下,这里主要写的计算高度的方法,和设置高度
代码如下
package com.example.myandroid_test_listview;
import java.util.ArrayList;
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;
public class MainActivity extends Activity {
private MyListView lv;
private ArrayList<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找控件
lv = (MyListView) findViewById(R.id.lv);
//准备数据
setData();
//为lv设置adapter
lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, list));
//设置lv的高度
setListViewHeight(lv);
}
@SuppressWarnings("rawtypes")
private void setListViewHeight(MyListView lv) {
//获取lv的适配器
ArrayAdapter adapter = (ArrayAdapter) lv.getAdapter();
//判断适配器是否为空,如果为空,则证明没有数据,也就不用计算高度了
if(adapter==null)
{
return;
}
//定义总高度变量
//listView总高度=(每个Item的内容高度*条目数量)+(每条分割线高度*(条目数量-1))+上下填充高度
int sumHeight=0;
//遍历adapter,得到每条item
for (int i = 0; i < adapter.getCount(); i++) {
/**
* position:每个item对应的索引
* convertView:复用,设置为null
* parent:对应此adapter的lv控件
*/
View item = adapter.getView(i,null,lv);
//判断如果得到item不为空的话,则得到此item的高度,与总高度进行相加
if(item!=null)
{
//设置item所在的布局参数
item.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
//设置每个条目的测量宽高的方式
item.measure(MeasureSpec.UNSPECIFIED,MeasureSpec.UNSPECIFIED);
//总高加每个item高度
sumHeight+=item.getMeasuredHeight();
}
}
ViewGroup.LayoutParams params = lv.getLayoutParams();
params.height=sumHeight
+(lv.getDividerHeight()*(adapter.getCount()-1))
+lv.getPaddingTop()+lv.getPaddingBottom();
lv.setLayoutParams(params);
}
private void setData() {
list = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
list.add("条目"+i);
}
}
}