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);
}
}