【问题标题】:Android Listview recycling is with animated rowAndroid Listview 回收与动画行
【发布时间】:2013-10-01 17:38:13
【问题描述】:

我正在尝试在 ListViews 中执行类似 iOS7 的删除行为。即单击 - 符号并动画(翻译)包含 - 符号的行左侧将显示删除按钮。然后,如果用户点击另一个 - 在不同的行上签名,旧行将动画回其原始位置,新点击的行将转换为左侧显示删除按钮。现在,在屏幕上显示的行上执行此操作没有问题,但向下或向上滚动列表,一些之前没有动画的随机视图被向右平移(取消删除时的效果)。我知道这是因为视图回收。我已经尝试了很多次保存打开(显示删除按钮)行的位置,将标签设置为打开/关闭,但没有成功,我仍然得到未触摸的行动画。我错过了代码,所以如果我发布它不会反映问题:(,所以我非常感谢任何帮助。

P.S:我使用的是view.animate().translateXBy([width of delete button]),即propertyAnimator

【问题讨论】:

    标签: android listview view recycle


    【解决方案1】:

    在动画开始之前告诉列表视图不要回收视图

    view.setHasTransientState(true);
    

    之后

    view.setHasTransientState(false);
    

    【讨论】:

    • 这需要 api 级别 16,截至 2014 年第一季度,我认为这有点太早了 IMO
    【解决方案2】:

    有点晚了,但也许这可以帮助某人,我实际上是在 getView 方法中执行此操作并且工作正常,此示例是一次运行多个动画,但仍然很容易修改它以进行简单动画:

     private void translationY(View convertView) {
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(convertView, View.TRANSLATION_Y, 400f, 0f);
        anim1.setDuration(TRANSLATION_Y_DURATION);
    
        ObjectAnimator anim2 = ObjectAnimator.ofFloat(convertView, View.ALPHA, 0f, 1f);
        anim2.setDuration(FADE_IN_DURATION);
    
        startAnimation(anim1, anim2);
    }
    
    private void startAnimation(Animator... items){
        AnimatorSet set = new AnimatorSet();
        set.playTogether(items);
        set.start();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多