android列表视图删除动画是自动删除第二个项目



我有一个带有自定义适配器的列表视图。每个项目都有一个删除图标,提示删除对话框片段。删除项目时,我正在执行幻灯片动画和动画结束时。该项目将从列表中删除,适配器将收到删除通知,如下所示:

// dialog fragment on clicking "delete"
positive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final FoldingCell fView = (FoldingCell) thisItem.getParent().getParent();
// wait for fold to finish then delete item
fView.postDelayed(new Runnable() {
@Override
public void run() {
deleteCell(fView, pos);
}
}, 850);

我的适配器类型是FoldingCell,所以我在删除之前折叠单元格,因此是postDelayeddeleteCell是下面的简单动画:

private void deleteCell(最终视图v,最终int索引({

TranslateAnimation transanim = new TranslateAnimation(0, 800, 0, 0);
transanim.setDuration(700);
transanim.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
items.remove(index);
// update array adapter
adapter.notifyDataSetChanged();
v.setVisibility(View.GONE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
v.startAnimation(transanim);
}

重要的是,我也在使用stableIds,这可能会导致问题。在动画删除发生后,适配器删除了两个项目,而不是只点击了一个。当我在上面的代码中禁用动画,只写时

items.remove(index);
adapter.notifyDataSetChanged();

确切地说,在删除时,即使使用stable ids(只是没有动画(,删除也能完美工作,为什么?这个问题似乎是动画和stable ids的结合,因为如果stableids为false,则删除将与动画一起工作。

除了使stable ids为假并解决由此产生的其他问题之外,我找不到一个好的解决方案。

已解决!使用稳定id,适配器删除额外字段的原因是,当我覆盖getItemId时,我返回适配器位置本身,我想,在动画中,当一个项目被删除时,相同的位置id被另一个列表项目占用,该列表项目也被删除。通过返回列表项唯一的不同itemId,不会发生此错误。所以我改了这个:

@Override
public long getItemId(int position) {
return position;
}

到此:

@Override
public long getItemId(int position) {
Item item = items(position);
return item.getId();
}

其中CCD_ 10是我正在传递给CCD_ 12的CCD_。Item是我的类,它保存每个项的元素/视图,getId()是getter,我必须返回每个Itemid整数

最新更新