Android AdapterView添加动画

Android AdapterView添加动画,android,animation,android-animation,Android,Animation,Android Animation,我有一个片段,它由一个GridView组成。用户可以单击操作栏图标将新项目添加到此GridView的底部。我想用一个动画来表示这个动作,其中GridView滚动到添加前数据集的底部,然后向下滚动一行(如果需要适合新项目),然后为添加新项目设置动画 My GridView由CursorAdapter支持,它由使用加载程序的ContentProvider填充,因此数据集更新是通过在onLoadFinished()中调出光标来提供的 我已将该过程分解为几个步骤: 如果还没有,请滚动到现有数据集的底部

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

My GridView由CursorAdapter支持,它由使用加载程序的ContentProvider填充,因此数据集更新是通过在
onLoadFinished()
中调出光标来提供的

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

  • 如果还没有,请滚动到现有数据集的底部
  • 检测滚动事件的结束
  • 在滚动事件结束时,将该项添加到备份数据集,触发布局
  • 在下一个预绘制事件(由ViewTreeObserver提供)中,如有必要,将旧视图向上动画一行
  • 在网格中设置新项目的动画
  • 其中,2和4是棘手的。至少对于2,存在一个相对简单的不雅观的解决方案-我调用
    GridView.smoothScrollToPosition(GridView.getCount())
    ,然后调用
    Handler.postDelayed(RestOfAnimationRunnable,一些时间间隔)
    挂起
    GridView.getLastVisiblePosition()
    等于
    GridView.getCount()-1
    。虽然很难看,但它很管用。(如果你有更好的主意,请告诉我!)

    4的问题是,使用
    ViewTreeObserver
    执行动画的模式取决于从Android获得正确的最终条件,如许多参考资料中关于的描述。换句话说,新视图必须是最后一个可见视图,但如果GridView的最后一行已满,则它将是第一个v在屏幕外的新行中查看

    因此,我正在寻找一种方法,告诉GridView滚动到底部,在第3步和第4步之间滚动,并且不将其绘制到屏幕上(因为这会使动画出错)。到目前为止,我已经尝试过:

    • 将GridView设置为转录模式:这可以工作,但会导致其他问题(例如,如果最后一行有空间放置新项目,则现有项目将完全透明),甚至会对我在此GridView上的其他动画产生负面影响

    • 将GridView的选择设置为新创建的最后一个项目:这可能是我正在寻找的,但我不确定将其放置在何处。我尝试在
      swapCursor()之后使用它
      这会导致GridView刷新,但这似乎没有任何效果。可能需要额外的步骤,如手动请求布局


    我认为我对上述第二种解决方案的理解是正确的,但我想从比我更了解这一点的人那里得到一些建议,因为它变得非常粗糙,我觉得我可能会把这里的事情搞得一团糟。

    我觉得我对代码的理解不够,无法给出一个很好的答案。不是吗他可能是一种方法

  • 向列表中添加一个新项,但将其设置为空,以便某些字段为默认值或空

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

  • 然后将列表滚动到列表中的该元素

  • 在视图“可见”时,添加真实数据

  • 然后触发添加动画


  • 这是一个比我想象的更好的解决方案。谢谢!