ScrollView里面嵌套ListView会出现只显示一行的情况,咋办啊。设置固定高度?No,你不可能知道ScrollView到底有多高。ScrollView嵌套了ListView之后无法正常的计算ListView的高度那么就需要我们自己处理了。
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/btn_loadMore"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="加载更多"
/>
</LinearLayout>
</ScrollView>
</RelativeLayout>
在Activity中我们需要在listView设置Adapter之后,计算出列表的尺寸就行了,是不是怕上拉加载更多出不了?不会出现这种问题咯。
public class MainActivity extends Activity {
private ListView listView;
private Button btn_loadMore;
private List<String> list=null;
private int ix=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list=new ArrayList<String>();
bindData();
this.listView=(ListView) findViewById(R.id.listView);
btn_loadMore=(Button) findViewById(R.id.btn_loadMore);
final ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
listView.setAdapter(adapter);
btn_loadMore.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
bindData();
adapter.notifyDataSetChanged();
setListViewHeightBasedOnChildren(listView);
}
});
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position,
long id) {
Toast.makeText(MainActivity.this,list.get(position),0).show();
}
});
setListViewHeightBasedOnChildren(listView);
}
private void bindData(){
for (int i =0; i <30; i++) {
ix++;
list.add("数据"+ix);
}
}
public void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
// listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
// 计算子项View 的宽高
listItem.measure(0, 0);
// 统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
----------------------------------------------------------------------------------------
点击加载更多之后出现的数据