实现自动生成列表页面的功能, 如根据车型类别显示需要查验的列表项, 需要在列表页面(check.xml)里面嵌套列表项页面(check_item.xml).
直接在列表页面(check.xml)里面使用ListView, 会导致当项目超过一页时, 只显示列表项, 无法显示列表项下面的列表页里面的内容. 于是, 考虑使用ScrollView滚动条.
在列表页面(check.xml)加入ScrollView, 在手机上运行时, ListView只会显示一行多一点.
check.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 查验页面 -->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="序 号"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="3"
android:gravity="center"
android:text="查验项目"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="判 定"
/>
</LinearLayout>
<ListView
android:id="@+id/lvCheckItems"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="查验结论:"
/>
<TextView
android:id="@+id/tvCheckResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="3"
android:gravity="center"
android:text="合 格"
/>
<Button
android:id="@+id/btnComplete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="完 成"
/>
</LinearLayout>
</LinearLayout>
</ScrollView>
check_item.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 查验项目item布局 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/tvId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="1"
/>
<TextView
android:id="@+id/tvItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_weight="3"
android:text="车身识别码"
/>
<CheckBox
android:id="@+id/ckQuality"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_weight="1"
android:checked="true"
/>
</LinearLayout>
Solution解决: 在CheckListAdapter.java中添加方法setListViewHeightBasedOnChildren(ListView listView)
CheckListAdapter.java
package com.tgb.adapter;
import com.tgb.R;
import com.tgb.ys.vehicle.model.CheckEntriesList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.CheckBox;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class CheckListAdapter extends ArrayListAdapter<CheckEntriesList> {
private String carId;
public CheckListAdapter(Context context, String carId) {
super(context);
this.carId = carId;
}
private static final int mLayout = R.layout.check_item;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
final CheckEntriesList checkEntriesList = mList.get(position);
if(convertView == null){
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate( mLayout, null);
viewHolder.tvId = (TextView)convertView.findViewById(R.id.tvId);
viewHolder.tvItem = (TextView)convertView.findViewById(R.id.tvItem);
viewHolder.ckQuality = (CheckBox)convertView.findViewById(R.id.ckQuality);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tvId.setText(checkEntriesList.getCheckItemCode() + "");
viewHolder.tvItem.setText(checkEntriesList.getCheckEntriesName());
viewHolder.ckQuality.setChecked(true);
return convertView;
}
public void setListViewHeightBasedOnChildren(ListView listView) {
//获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i=0; i<listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0); //计算子项View的宽高
//统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
System.out.println(listItem.getMeasuredHeight() + "===========" + i);
}
//listView.getDividerHeight()获取子项间分隔符占用的高度
//params.height最后得到整个ListView完整显示需要的高度
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
((MarginLayoutParams)params).setMargins(10, 10, 10, 10);
listView.setLayoutParams(params);
}
class ViewHolder {
TextView tvId, tvItem;
CheckBox ckQuality;
}
}
在CheckListActivity.java中
CheckListAdapter adapter = new CheckListAdapter(this, carId);
List<CheckEntriesList> checkEntriesLists = dataService.queryRequiredItem(categoryCode);
adapter.setList(checkEntriesLists);
lvCheckItems.setAdapter(adapter);
adapter.setListViewHeightBasedOnChildren(lvCheckItems);
How can we do it 我们怎么解决的?
把ListView的layout_height改成400dip, 而不是用match_parent和wrap_content, 你会发现这样的话ListView就显示的多了很多. 于是, 就有了上面的方法: 把ListView所有的item的高度算出来给ListView设置.
简单来说就是把layout_height写死,这种办法也很适用于GridView(如果能估计得出GridView的高度的话)。