滚动条:解决ScrollView与ListView显示冲突问题

实现自动生成列表页面的功能, 如根据车型类别显示需要查验的列表项, 需要在列表页面(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的高度的话)。

参考文档:http://2528.iteye.com/blog/1201511

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值