我们在做android开发的时候,经常会遇到Scrollview嵌套ListView的问题,其中有几点问题,就是scrollview和listview都会滑动。
第一个问题,解决listview的滑动:设置listview不滑动
重写listview,重写listview中的onmeasure方法
/**
* 设置不滚动
*/
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
第二个问题,焦点问题,刚进入这个页面时焦点往往会移到listview上面去,所以
调用下面一个方法,将焦点移到scrollview上,并且定位到顶部
private void scrollToTop() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
getView(R.id.topLayout).requestFocus();
getView(R.id.topLayout).setFocusable(true);
getView(R.id.topLayout).setFocusableInTouchMode(true);
scrollView.fullScroll(ScrollView.FOCUS_UP);
}
}, 500);
}
第三个问题,因为listview之间的item会有一些divider分隔,所以有些时候会出现listview中的item显示不全,所以现在要根据实际
通过计算将listview的实际高度给计算出来:
/**
* 根据字item的高度设置listview的高度
* @param listView
*/
public void setListViewHeightBasedOnChildren(ListView listView) {
if(listView == null) return;
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
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);
}
这样就解决了其中最重要的三个问题。。。有什么问题还请大家不吝赐教。。