问题:
(1) 向列表视图中的行添加触摸侦听器,以便在滑动时。
(2) 滑动动画播放
(3) 行在后端被删除,并且
(4) 动画播放没有任何闪烁或跳动。“闪烁”是指动画完成后删除的行会短暂显示。
我怀疑动画监听器发生了一些奇怪的事情,所以我最终做了以下事情(按照给定的顺序完成):
- 通过将 setFillAfter 和 setFillenabled 设置为 true 来制作动画并使其持续存在
- 动画结束时使视图不可见
- 删除数据库中的行
- 重置动画
- 重新加载列表视图
- 使视图可见(但再等待 300 毫秒)
结果删除了没有抖动或闪烁的行,但由于额外的 300 毫秒等待,它现在感觉迟缓。(我也不确定这种延迟是否适用于所有设备。)
更新:我应该指出,300 毫秒的延迟是它工作的原因。这很奇怪,因为到那时动画被重置并且列表视图具有最新数据。应该没有理由让视图可见会使旧行短暂显示,对吗?
我还尝试使用 ViewPropertyAnimator (根据在 ViewPager 和 setFillAfter 上使用动画),但由于某种原因,在动画的每一步都调用了 onAnimationEnd 侦听器。
我还读到我们应该实现一个自定义视图并覆盖它的 onAnimationEnd 监听器。(但是,我还没有尝试过这种方法。)
更新:只是试图在最后添加一个额外的虚拟动画(根据Android Animation Flicker)。但是,这不起作用
我的测试手机运行冰淇淋三明治。我的应用程序针对 Gingerbread 及之后。
那么正确的解决方案是什么?我这样做是错误的吗?
这是代码:
@Override
public boolean onTouch(final View view, MotionEvent event)
{
//...
switch(action) {
//...
case MotionEvent.ACTION_MOVE:
// ...
if (//check for fling
{
view.clearAnimation();
//animation = standard translate animation
animation.setAnimationListener(new AnimationListener() {
//
@Override
public void onAnimationEnd(Animation animation)
{
view.setVisibility(View.INVISIBLE);
flingListener.onFling(cursorPosition, view, velocity);
}
//...
});
view.startAnimation(animation);
}
break;
//
}
“一飞冲天的听众”:
@Override
public void onFling(int position, final View view, float velocity)
{
//delete row -- its actually a Loader
//the following code runs in the Loader's onLoadFinished
view.clearAnimation();
adapter.notifyDataSetChanged();
adapter.swapCursor(null);
//reload listview -- it's actually a Loader
//the following code runs in the Loader's onLoadFinished
adapter.swapCursor(cursor);
view.postDelayed(new Runnable() {
@Override
public void run()
{
view.setVisibility(View.VISIBLE);
}
}, 300);
}
更新:比较 Chet Haase 的代码后,我们正在做类似的事情,但有一些重要的区别:(1)他使用 onPreDraw 侦听器和 ListView 树观察器进行实际删除,(2)他不仅从数组中删除行,而且也来自列表视图。模仿他的代码后,还是不行。现在的问题是加载器——我使用加载器异步删除行。Loader 似乎在后端删除行之前强制对 ListView 进行额外的绘制调用。这是闪烁的(另一个)原因。不过还没有想出解决办法。