美文网首页
ScroyView嵌套listview

ScroyView嵌套listview

作者: 恍惚的鱼 | 来源:发表于2018-05-10 15:08 被阅读0次

           在项目中经常会用到ScrollView嵌套ListView的情况。如果使用原生的ListView会出现只显示一行的情况,出现这个的原因是在scrollView中ListView在OnMeasure阶段无法测出实际的高度。

    1、第一种方法

        我们需要给他设置AT_MOST模式以支持很大的高度。这时候可以自定义一个MyListView 继承自Listview,然后重写onMeasure方法即可:

    /**

    * Created by tangzejian on 2018/3/27.

    * ScrollView嵌套ListView

    */

    public class ScrollViewListViewextends ListView {

    public ScrollViewListView(Context context) {

    super(context);

        }

    public ScrollViewListView(Context context, AttributeSet attrs) {

    super(context, attrs);

        }

    public ScrollViewListView(Context context, AttributeSet attrs,

                                  int defStyle) {

    super(context, attrs, defStyle);

        }

    /**

    * 重写该方法,达到使ListView适应ScrollView的效果

    */

        @Override

        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >>2,

                    MeasureSpec.AT_MOST);

            super.onMeasure(widthMeasureSpec, expandSpec);

        }

    }

    2、第二种方法

        动态设置ListView的高度:

    public void setListViewHeightBasedOnChildren(ListView listView) {

    // 获取ListView对应的Adapter

        ListAdapter listAdapter = listView.getAdapter();

        if (listAdapter ==null) {

    return;

        }

    int totalHeight =0;

        for (int i =0, len = listAdapter.getCount(); i < len; i++) {

    // listAdapter.getCount()返回数据项的数目

            View listItem = listAdapter.getView(i, null, listView);

            // 计算子项View 的宽高

            listItem.measure(0, 0);

            // 统计所有子项的总高度

            totalHeight += listItem.getMeasuredHeight();

        }

    ViewGroup.LayoutParams params = listView.getLayoutParams();

        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() -1));

        // listView.getDividerHeight()获取子项间分隔符占用的高度

    // params.height最后得到整个ListView完整显示需要的高度

        listView.setLayoutParams(params);

    }

    以上两种方法都可以解决ListView的Item显示不全问题。

    ps:如果使用第一种方法还会遇到一个小问题问题,ListView加载完后ScroyView或滑动到ListView的位置,这时候可以自定义一个MyScroyView 继承自ScroyView,然后重写computeScrollDeltaToGetChildRectOnScreen方法即可:

    /**

    * Created by tangzejian on 2018/4/11.

    * 禁止加载数据时滑到底部

    */

    public class MyScrollViewextends ScrollView {

    public MyScrollView(Context context) {

    super(context);

        }

    public MyScrollView(Context context, AttributeSet attrs) {

    super(context, attrs);

        }

    public MyScrollView(Context context, AttributeSet attrs, int defStyle) {

    super(context, attrs, defStyle);

        }

    /**

        * @param rect 解决

        * @return 由于子控件的大小导致ScrollView滚动到底部的问题

    */

        @Override

        protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {

    return 0;

        }

    }

    相关文章

      网友评论

          本文标题:ScroyView嵌套listview

          本文链接:https://www.haomeiwen.com/subject/cawzrftx.html