带有 SlidingTabLayout 的 ViewPager 中的 Listview - 高度问题

Posted

技术标签:

【中文标题】带有 SlidingTabLayout 的 ViewPager 中的 Listview - 高度问题【英文标题】:Listview inside a ViewPager with SlidingTabLayout - Height problems 【发布时间】:2016-04-26 09:37:35 【问题描述】:

我有一个片段,我在其中托管了一个带有 TabLayout 的 ViewPager,ViewPager 的内容是一个包含 ListView 的片段。

我知道我的 ViewPager 无法使用 wrap_content,开始时的高度没有得到计算。

所以我这样做了:

 @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        boolean wrapHeight = MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST;

        final View tab = getChildAt(0);
        if (tab == null) 
            return;
        

        int width = getMeasuredWidth();
        if (wrapHeight) 
            // Keep the current measured width.
            widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
        
        Fragment fragment = ((Fragment) getAdapter().instantiateItem(this, getCurrentItem()));
        heightMeasureSpec = getMeasureExactly(fragment.getView(), widthMeasureSpec);

        //Log.i(Constants.TAG, "item :" + getCurrentItem() + "|height" + heightMeasureSpec);
        // super has to be called again so the new specs are treated as
        // exact measurements.
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    

    int getMeasureExactly(View child, int widthMeasureSpec) 
        child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        int height = calculateHeight ((ListView)child.findViewById(R.id.list)); //getMeasuredHeight();

        System.out.println("Height is: "+height);
        return MeasureSpec.makeMeasureSpec(height , MeasureSpec.EXACTLY);
    


    private int calculateHeight(ListView list) 

        int height = 0;

        for (int i = 0; i <10; i++) 
            View childView = list.getAdapter().getView(i, null, list);
            childView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            height+= childView.getMeasuredHeight();
        

        //dividers height
      //  height += list.getDividerHeight() * 11; //list.getCount();

        return height;

    

我得到一个要填充 10 行的列表,但只有 9 行可见,其中一个移出视图。

这里的问题是如何准确测量列表行高并将其添加到 10 个项目。

这个问题一直困扰着***,但似乎没有具体的解决方案。特别是对于 ListView 孩子。因为我可以让它与 TableLayout 一起工作。

我也知道这样做的内存和滚动约束,但这是设计使然,我对此无能为力。

上述代码的要点是传递一排列表的高度,然后将其乘以10(因为我只想要列表中的10行+分隔符高度)

【问题讨论】:

这听起来很傻,但你试过乘以 11 吗? 是的,但这不符合逻辑 - 不是很合乎逻辑,可能会产生不可预知的结果。如果我把它放在循环中,那也会给我一个 ArrayIndexOutOfBounds。 【参考方案1】:

在 XML 文件中,放入列表视图选项

android:layout_weight="0.92"

【讨论】:

以上是关于带有 SlidingTabLayout 的 ViewPager 中的 Listview - 高度问题的主要内容,如果未能解决你的问题,请参考以下文章

带有折叠工具栏的Android SlidingTabLayout错误定位

SlidingTabLayout 底部填充

SlidingTabLayout 选项卡之间的通信

SlidingTabLayout 以适应屏幕

将图标添加到 SlidingTabLayout 而不是文本

SlidingTabLayout 下方的 SlidingTabStrip 指示器