gpt4 book ai didi

安卓 GridView : getNumColumns() returns AUTO_FIT value

转载 作者:行者123 更新时间:2023-11-29 01:34:15 34 4
gpt4 key购买 nike

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

简要背景.....我在 fragment 中使用 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(),但根据文档,它可以返回 -1(AUTO_FIT) 如果 View 尚未布局,这是我不想要的。

因此,为了避免 -1 条件并确保 gridview 实际放置,我做了类似这样的事情 How can you tell when a layout has been drawn?在 fragment 的 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;
}

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

那么对于这种情况我应该怎么做,有什么建议吗?我可以添加延迟(最坏的情况设计)或者我可以添加对 -1 的检查并返回 1(使用上面代码的想法 fragment ),这可能会导致竞争条件。可能我遗漏了什么或者我的假设是错误的。

最佳答案

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

}
});

关于安卓 GridView : getNumColumns() returns AUTO_FIT value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29466623/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com