Android AdapterView附加动画

时间:2014-12-31 03:44:08

标签: android animation android-animation

我有一个由单个GridView组成的Fragment。用户可以单击操作栏图标以将新项添加到此GridView的底部。我希望这个动作由动画表示,其中GridView滚动到预添加数据集的底部,然后向下滚动一行(如果需要适合新项目),然后动画添加新项目。

我的GridView由CursorAdapter支持,它由ContentProvider使用Loader填充,因此通过交换onLoadFinished()中的Cursor来提供数据集更新。

我已将程序分解为几个步骤:

  1. 如果还没有,请滚动到现有数据集的底部
  2. 检测滚动事件的结束
  3. 在滚动事件结束时,将项目添加到后备数据集,触发布局
  4. 在下一个PreDraw事件中(由ViewTreeObserver提供,如有必要,将旧视图设置为一行
  5. 将新项目设置为网格动画
  6. 其中,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,我觉得我可以在这里弄得很糟糕。

1 个答案:

答案 0 :(得分:1)

我觉得我不太了解你已经使用代码的地方给出了一个很好的答案。这可能是一种方法。

  1. 在列表中添加一个新项但是为空,因此某些字段为default或null。

  2. 检测这些默认/空字段,并让CursorAdapter将视图渲染为透明和/或高度为0或1px。

  3. 然后将列表滚动到列表中的该元素。

  4. 在视图为"可见"时,添加实际数据。

  5. 然后触发加法动画。