List View和ScrollView冲突的解决以及List View在Scroll View中计算高度

List View和ScrollView冲突的解决

这是MainActivity

package com.example.dispatchingevents;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.ScrollView;

public class MainActivity extends Activity {

	ScrollView scroll;
	ListView list;
	String[] books = { "A语言", "B语言", "C语言", "D语言", "E语言", "A1语言", "B1语言", "C1语言", "D1语言", "E1语言", "A2语言", "B2语言",
			"C2语言", "D2语言", "E2语言", "A2语言", "B2语言", "C语言", "D语言", "E语言" };

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		scroll = (ScrollView) findViewById(R.id.scroll);
		list = (ListView) findViewById(R.id.list);

		ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, books);
		// 配置给listview

		list.setAdapter(adapter);

		setListViewHeight(list);

		list.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View arg0, MotionEvent arg1) {
				// TODO Auto-generated method stub
				scroll.requestDisallowInterceptTouchEvent(true);
				return false;
			}
		});
		list.setOnScrollListener(new OnScrollListener() {

			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {
			}

			@Override
			public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
				// 计算第一条的索引加上当前页面能显示的listview的总条目的数量,计算出显示的最后一条的索引号
				int i = firstVisibleItem + visibleItemCount;
				if (i == totalItemCount) {// 如果
					scroll.requestDisallowInterceptTouchEvent(false);
				}
			}
		});
	}

	public void setListViewHeight(ListView listView) {
		ArrayAdapter listAdapter = (ArrayAdapter) listView.getAdapter();
		if (listAdapter == null) {
			return;
		}
		int totalHeight = 0;
		for (int i = 0; i < listAdapter.getCount(); i++) {
			View listItem = listAdapter.getView(i, null, listView);
			if (listItem != null) {
				listItem.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
				listItem.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
				totalHeight += listItem.getMeasuredHeight();
			}
			ViewGroup.LayoutParams params = listView.getLayoutParams();
			params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1))
					+ listView.getPaddingTop() + listView.getPaddingBottom();
			int h = getWindowManager().getDefaultDisplay().getHeight();
			if (params.height > h / 2) {
				params.height = h / 2;
			}
			listView.setLayoutParams(params);
		}
	}
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		// TODO Auto-generated method stub
		outState.putInt("prograss", 100);
		super.onSaveInstanceState(outState);
	}
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		savedInstanceState.getInt("prograss");
		super.onRestoreInstanceState(savedInstanceState);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值