1

getNumColumns()forGridView从 API 11 开始可用,有什么方法可以在 API 8 中获取此方法?

4

4 回答 4

7

在这个重复的帖子中,有人提出了适用于 API 8 的答案:

private int getNumColumnsCompat() {
    if (Build.VERSION.SDK_INT >= 11) {
        return getNumColumnsCompat11();

    } else {
        int columns = 0;
        int children = getChildCount();
        if (children > 0) {
            int width = getChildAt(0).getMeasuredWidth();
            if (width > 0) {
                columns = getWidth() / width;
            }
        }
        return columns > 0 ? columns : AUTO_FIT;
    }
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private int getNumColumnsCompat11() {
    return getNumColumns();
}
于 2013-09-12T09:46:34.413 回答
4

我在我的一个自定义 GridView 子类上添加了这个实现,它按预期工作。我检查了 GridView 类的声明字段,至少在 API 8 上,它们确实已经有一个名为的字段mNumColumns(这是 API 18 返回的内容getNumColumns())。他们可能没有将字段名称更改为其他名称,然后又在 API 8 和 18 之间更改,但我没有检查。

@Override
public int getNumColumns() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        return super.getNumColumns();
    } else {
        try {
            Field numColumns = getClass().getSuperclass().getDeclaredField("mNumColumns");
            numColumns.setAccessible(true);
            return numColumns.getInt(this);
        } catch (Exception e) {
            return 1;
        }
    }
}

@Override 不会导致任何错误,因为它只是一个安全检查注释 AFAIK。

我也不知道是否有任何反对建议这样做而不是使用单独的getNumColumnsCompat()方法(如@elgui 回答),但我发现它像这样非常整洁。

于 2014-06-14T19:52:15.553 回答
1

这可能不是您想听到的答案,但您必须创建一个自定义GridView' ,它的 API 11 功能与 API 8 中可用的功能相匹配。

于 2013-02-14T16:30:19.727 回答
0

加入最佳答案,然后沸腾:

@SuppressLint("NewApi")
@Override
public int getNumColumns() {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
      return super.getNumColumns();

   try {
      Field numColumns = getClass().getSuperclass().getDeclaredField("mNumColumns");
      numColumns.setAccessible(true);
      return numColumns.getInt(this);
   }
   catch (Exception e) {}

   int columns = AUTO_FIT;
   if (getChildCount() > 0) {
      int width = getChildAt(0).getMeasuredWidth();
      if (width > 0) columns = getWidth() / width;
   }
   return columns;
}

:D

于 2015-02-23T23:06:00.850 回答