- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题类似于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/
我想更好地了解 Gridview 的工作原理,尤其是 auto_fit。这是 XML 布局: 它适用于一系列六个缩略图(48*48 像素)。在纵向模式下,它显示一行六列。 我不明白为什么 andr
我的问题类似于How to know GridView numColumns before setting up adapter in case of auto_fit?但还没有回答,所以试试我的运气
您好,我正在开发小型 android 应用程序,我想在其中显示带有一些元素的简单 gridview。它工作正常。唯一的问题是即使有空间,它也总是只显示两列。它平均将屏幕分成 2 列并仅显示两个元素。如
我是一名优秀的程序员,十分优秀!