我有一个由单个GridView组成的Fragment。用户可以单击操作栏图标以将新项添加到此GridView的底部。我希望这个动作由动画表示,其中GridView滚动到预添加数据集的底部,然后向下滚动一行(如果需要适合新项目),然后动画添加新项目。
我的GridView由CursorAdapter支持,它由ContentProvider使用Loader填充,因此通过交换onLoadFinished()
中的Cursor来提供数据集更新。
我已将程序分解为几个步骤:
ViewTreeObserver
提供,如有必要,将旧视图设置为一行其中,2和4是棘手的。至少对于2,存在一个相对简单的不优雅的解决方案 - 我呼叫GridView.smoothScrollToPosition(GridView.getCount())
,然后Handler.postDelayed(RestOfAnimationRunnable, SOME_INTERVAL)
等待GridView.getLastVisiblePosition()
等于GridView.getCount() - 1
。这很难看,但它确实有效。 (如果你有更好的想法,请告诉我!)
4的问题在于,使用ViewTreeObserver
执行动画执行动画的模式取决于从Android获取正确的最终条件,如许多关于Android animations的资源中所述。换句话说,新视图必须是最后一个可见视图,但如果GridView的最后一行已满,则它将是新屏幕外行中的第一个视图。
所以我要找的是告诉GridView一直滚动到底部的方法,并在步骤3和4之间这样做,并且这样做而不将其绘制到屏幕上(因为它会拧紧)动画)。到目前为止,我已经尝试过:
将GridView设置为成绩单模式:这有效,但会导致其他故障(例如,如果最后一行有新项目的空间,则现有项目将变为完全透明)甚至对我在GridView上的其他动画产生负面影响。
将GridView的选择设置为新创建的最后一项:这可能是我正在寻找的,但我不知道该把它放在哪里。我已经尝试在导致GridView刷新的swapCursor()
之后使用它,但这似乎没有任何效果。也许还需要一个额外的步骤,例如手动请求布局。
我认为我已经采用上述第二种解决方案走上了正轨,但我想从一个比我更了解这个问题的人那里得到一些建议,因为它变得非常hacky,我觉得我可以在这里弄得很糟糕。
答案 0 :(得分:1)
我觉得我不太了解你已经使用代码的地方给出了一个很好的答案。这可能是一种方法。
在列表中添加一个新项但是为空,因此某些字段为default或null。
检测这些默认/空字段,并让CursorAdapter将视图渲染为透明和/或高度为0或1px。
然后将列表滚动到列表中的该元素。
在视图为"可见"时,添加实际数据。
然后触发加法动画。