在ScrollView中嵌套listview,ScrollView会无法准确计算listview的大小,
只会显示一行listview的信息,需要对listview高度进行设置
具体代码在fixListViewHeight()方法体中
//代码来源于百度百科 http://jingyan.baidu.com/article/afd8f4de4695af34e386e969.html
public class HomeFragment extends Fragment {
ListView listView_myPackage;
List<Bean_item_listview_homefragment_mypackage> beans_myPackage;
ListViewAdapter_myPackage adapter_myPackage;
ListView listView_nearbyStage;
ListView listView_news;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment_home, container, false);
listView_myPackage = (ListView) view.findViewById(R.id.listView_homeFragment_myPackage);
beans_myPackage = ListViewItemDao.getBeans_myPackage();
adapter_myPackage = new ListViewAdapter_myPackage(getActivity(), beans_myPackage);
listView_myPackage.setAdapter(adapter_myPackage);
fixListViewHeight(listView_myPackage);
return view;
}
/**
* 在ScrollView中放入listview,ScrollView会无法准确计算listview的高度,
* 只会显示一行listview的信息,需要对listview高度进行设置
* @param listView
*/
private void fixListViewHeight(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
int totalHeight = 0;
// 如果没有设置数据适配器,则ListView没有子项,返回
if (listAdapter == null) {
return;
}
for (int i = 0,len = listAdapter.getCount(); i < len; i++) {
View listViewItem = listAdapter.getView(i, null, listView);
// 计算子项View 的宽高
listViewItem.measure(0, 0);
// 计算所有子项的高度和
totalHeight += listViewItem.getMeasuredHeight();
}
//设置布局参数
ViewGroup.LayoutParams params = listView.getLayoutParams();
// listView.getDividerHeight()获取子项间分隔符的高度
listView.setDividerHeight(0);
/*分割线高度设置成0,在Theme.NoTitleBar主题下,不设置成0会默认画一条黑色的分割线,并且点击item背景变黄色,将主题改为Theme.Holo.Light.NoActionBar,则分割线正常且点击item背景变灰色*/
// params.height设置ListView完全显示需要的高度
// params.height = totalHeight ;
params.height = totalHeight + (listView.getDividerHeight()*(listAdapter.getCount()-1));
listView.setLayoutParams(params);
}
}
在计算完listview的高度后,ScrollView起始位置不再是顶部。
原因就是Activity计算窗口的高度是在listview没有填充数据时候就完成了,所以ScrollView嵌套listview需要指定高度,否则就会按照layout中定义的默认高度计算.
解决方案:要在listview填充数据完成后调用scrollTo设置位置.
ScrollView scrollView_homeFragment;
scrollView_homeFragment = (ScrollView) view.findViewById(R.id.scrollView_homeFragment);
scrollView_homeFragment.smoothScrollTo(0, 0);//从顶部开始滑动
当myScrollView.smoothScrollTo(0,0);无效时, 在代码里去掉listview的焦点 lv.setFocusable(false);
进入页面后,ScrollView显示位置下移,主要是因为焦点问题. 所以在它的上一层布局或者根布局加
android:focusableInTouchMode=”true” ,解决根本问题
android:focusableInTouchMode="true"
另外,可以通过重写ListView的OnMesure 方法,解决冲突。对GridView同样适用。
@Override
/**
* 重写该方法、达到使ListView适应ScrollView的效果
*/
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}