FragmentGridPagerAdapter i和i2值

时间:2014-09-18 11:22:35

标签: android fragment adapter wear-os

我对FragmentGridPagerAdapter有疑问。当我覆盖public Fragment getFragment(int i,int i2)函数并记录i和i2值时,我得到了这些奇怪的结果:

当我向右滑动时i2得到增加,所以它变为0,1,2等等。这是有道理的。

但是让我说我​​向右滑动6次然后向下滑动1次我希望i2为6而i为1.但是,i2会立即重置到第一个位置的第一个位置。有谁知道是什么导致这个或背后的逻辑是什么?

2 个答案:

答案 0 :(得分:1)

这不是getFragment API的问题,这是GridViewPager元素的实际行为。它实际上并不像网格 - 向上或向下滑动始终从第一列开始。

据推测,这是为了强制执行谷歌的design guidelines用于2D选择器,其中说“导航应该是垂直的 - 然后是水平的,而不是水平的,然后是垂直的”。

答案 1 :(得分:1)

只是为了让它更具可读性:i应该命名为rowi2应该被称为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,或者在返回之前做一些检查,看看这个位置是否对新行有效。