Android Gridview:getNumColumns()返回AUTO_FIT值

时间:2015-04-06 06:44:19

标签: android android-fragments android-gridview android-lifecycle

我的问题类似于How to know GridView numColumns before setting up adapter in case of auto_fit?,但它还没有回答,所以试试我的运气,我已经研究了一点。

简短背景.....我在片段中使用gridview布局,下面是xml:

 <GridView
        android:id="@android:id/someID"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:columnWidth="@dimen/grid_width"
        android:numColumns="auto_fit"
        android:stretchMode="columnWidth"
        android:visibility="visible" >
    </GridView>

现在目标很容易获得列数,即调用gridview对象(http://developer.android.com/reference/android/widget/GridView.html#attr_android:numColumns)的getNumColumns(),但根据doc它可以返回-1(AUTO_FIT如果还没有列出我不想要的视图。

所以为了避免-1条件并确保实际铺设gridview,我做了类似这样的事情How can you tell when a layout has been drawn? 在片段的onActivtyCreated()回调中。

但在这里它变得有趣,我添加了几个日志并观察到有时候我得到了正确的值,但有时我得到-1。我做了一点点挖掘并检查了gridview的实际代码,其中设置了列数。

   //declaration of vars
    public static final int AUTO_FIT = -1;
    private int mNumColumns = AUTO_FIT;

    private boolean determineColumns(int availableSpace) {
        final int requestedHorizontalSpacing = mRequestedHorizontalSpacing;
        final int stretchMode = mStretchMode;
        final int requestedColumnWidth = mRequestedColumnWidth;
        boolean didNotInitiallyFit = false;

        if (mRequestedNumColumns == AUTO_FIT) {
            if (requestedColumnWidth > 0) {
                // Client told us to pick the number of columns
                mNumColumns = (availableSpace + requestedHorizontalSpacing) /(requestedColumnWidth + requestedHorizontalSpacing);
                } else {
                    // Just make up a number if we don't have enough info
                    mNumColumns = 2;
                }
            } else {
                // We picked the columns
                mNumColumns = mRequestedNumColumns;
            }

            if (mNumColumns <= 0) {
                mNumColumns = 1;
            }

此代码段仅显示设置mNumColumns值的位置,对于您可以看到的整个代码http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.2_r1/android/widget/GridView.java,理论上现在mNumColumns永远不能获得-1,除非未布置视图。

那么我应该为这个场景做些什么呢?我可以添加延迟(更糟糕的案例设计)或者我可以添加一个检查-1并返回1(使用上面代码的想法片段)可能会导致竞争状况。可能我错过了一些东西,或者我的假设是错误的。

1 个答案:

答案 0 :(得分:1)

gridview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            gridview.getViewTreeObserver().removeOnGlobalLayoutListener(this);
           int num = gridview.getNumColumns();
           // do what u need here

        }
    });