ScrollView中嵌套ListView,只显示一行ListView信息的解决方案

在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);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值