android 列表视图删除动画自动删除第二个项目
android listview deletion animation is automatically deleting a second item
我有一个带有自定义适配器的列表视图。每个项目都有一个删除图标,提示删除对话框片段。在删除项目时,我正在执行幻灯片动画并在动画结束时执行。该项目已从列表中删除,适配器会收到有关删除的通知,如下所示:
// 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
类型,所以我在删除之前折叠单元格,因此 postDelayed
。 deleteCell
是下面的简单动画:
private void deleteCell(final View v, final int index) {
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
为假,则删除与动画一起使用。
除了使 stable ids
为假并解决由此产生的其他问题外,我找不到好的解决方案。
已解决!使用 stableids 适配器删除额外字段的原因是,当我覆盖 getItemId
时,我正在 returning 适配器位置本身,我猜,在动画期间,当一个项目被删除时,那个相同的位置 ID 被另一个列表项占用,该列表项也被删除。通过 returning 列表项唯一的不同 itemId,不会发生此错误。所以我改变了这个:
@Override
public long getItemId(int position) {
return position;
}
对此:
@Override
public long getItemId(int position) {
Item item = items(position);
return item.getId();
}
其中 items
是我传递给 adapter
的 arraylist
。 Item 是我的 class,它包含每个项目的 elements/views,getId()
是 getter 我必须 return 每个 id
整数=18=]
我有一个带有自定义适配器的列表视图。每个项目都有一个删除图标,提示删除对话框片段。在删除项目时,我正在执行幻灯片动画并在动画结束时执行。该项目已从列表中删除,适配器会收到有关删除的通知,如下所示:
// 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
类型,所以我在删除之前折叠单元格,因此 postDelayed
。 deleteCell
是下面的简单动画:
private void deleteCell(final View v, final int index) {
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
为假,则删除与动画一起使用。
除了使 stable ids
为假并解决由此产生的其他问题外,我找不到好的解决方案。
已解决!使用 stableids 适配器删除额外字段的原因是,当我覆盖 getItemId
时,我正在 returning 适配器位置本身,我猜,在动画期间,当一个项目被删除时,那个相同的位置 ID 被另一个列表项占用,该列表项也被删除。通过 returning 列表项唯一的不同 itemId,不会发生此错误。所以我改变了这个:
@Override
public long getItemId(int position) {
return position;
}
对此:
@Override
public long getItemId(int position) {
Item item = items(position);
return item.getId();
}
其中 items
是我传递给 adapter
的 arraylist
。 Item 是我的 class,它包含每个项目的 elements/views,getId()
是 getter 我必须 return 每个 id
整数=18=]