我对FragmentGridPagerAdapter有疑问。当我覆盖public Fragment getFragment(int i,int i2)函数并记录i和i2值时,我得到了这些奇怪的结果:
当我向右滑动时i2得到增加,所以它变为0,1,2等等。这是有道理的。
但是让我说我向右滑动6次然后向下滑动1次我希望i2为6而i为1.但是,i2会立即重置到第一个位置的第一个位置。有谁知道是什么导致这个或背后的逻辑是什么?
答案 0 :(得分:1)
这不是getFragment API的问题,这是GridViewPager元素的实际行为。它实际上并不像网格 - 向上或向下滑动始终从第一列开始。
据推测,这是为了强制执行谷歌的design guidelines用于2D选择器,其中说“导航应该是垂直的 - 然后是水平的,而不是水平的,然后是垂直的”。
答案 1 :(得分:1)
只是为了让它更具可读性:i
应该命名为row
而i2
应该被称为column
。
实施GridViewPager
是为了帮助您重现Android Wear Home流行为。如您所知,第一列中有通知卡,右侧有操作。如果您向右侧滚动到第二个或第三个操作页面以进行特定通知,那么如果(在向上或向下滑动之后)他将落在操作页面的中间以进行完全不同的通知,则会使用户感到非常困惑。他会看到一些动作,但很难猜出它所引用的通知。所以他们以这种方式实现它,因此它会重置当前列并始终返回索引为0的列。
此行为显示在有关Building Advanced UIs for Android Wear的视频中 关于 2:50 此主题已启动(如果您想跳过,实际说明接近 3:25 ),但我建议观看整个视频。
要更改此行为,您只需覆盖getCurrentColumnForRow(int row, int currentColumn)
(或FragmentGridPagerAdapter
)中的GridViewAdapter
方法即可。
以下是该方法的文档:
返回垂直导航时要到达的列 指定的行。
默认实现只返回0.
参数
row the row in question currentColumn the column which is currently centered
退货
the column to arrive at
要达到你想要的效果,你只需要返回currentColumn
,或者在返回之前做一些检查,看看这个位置是否对新行有效。