网上一种方法计算和设置ListView的高度
public static void setListViewHeightBasedOnChildren(ListView listView) {
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);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
但此种方法会使item全部展开,失去了listview的效果
因此查资料从事件分发机制入手,固定listView的高度,在listview的touch事件时,使scrollview放弃事件的处理
mListView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
//当手指按下的时候
x1 = event.getX();
y1 = event.getY();
}
if(event.getAction() == MotionEvent.ACTION_MOVE) {
//当手指离开的时候
x2 = event.getX();
y2 = event.getY();
if(y1 > y2 ) {
Log.e("TAG","向上滑动");
//判断向上滑动时,listView最后可见项是否为走后一项,如果是则scrollView拦截滑动事件
if(mListView.getLastVisiblePosition()==(mListView.getCount()-1)){
scrollView.requestDisallowInterceptTouchEvent(false);
}else{
scrollView.requestDisallowInterceptTouchEvent(true);
}
} else if(y1<y2) {
Log.e("TAG","向下滑动");
if(mListView.getFirstVisiblePosition()==0){
scrollView.requestDisallowInterceptTouchEvent(false);
}else{
scrollView.requestDisallowInterceptTouchEvent(true);
}
}
}
return false;
}
});