2016-01-20 30 views
4

我有一個片段,我已經託管了一個ViewPager與TabLayout,ViewPager的內容是一個包含ListView的片段。ListView裏面的ViewPager與SlidingTabLayout - 高度問題

我知道我的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一起工作。

我也知道這樣做的內存和滾動constriants,但這是設計,並沒有太多我可以做的。

上面代碼的要點是通過列表中的一個行的高度,然後用10乘以它(因爲我只希望在我的名單10行+分隔高度)

+0

這可能聽起來很愚蠢,但你試過乘以11嗎? –

+0

是的,但這不符合邏輯 - 不是很合乎邏輯,可能會產生不可預知的結果。如果我把它放在循環中,也會給我一個ArrayIndexOutOfBounds。 – Skynet

回答

0

在XML文件中,把在列表視圖選項

android:layout_weight="0.92"