gpt4 book ai didi

android - CursorAdapter 支持的 ListView 删除动画 "flickers"删除

转载 作者:可可西里 更新时间:2023-11-01 19:00:34 24 4
gpt4 key购买 nike

我正在尝试使用 SwipeToDismissUndoListListView 中实现滑动删除扩展 Roman Nurik's SwipeToDismiss 的库样本。

我的问题是删除动画。由于 ListViewCursorAdapter 支持,动画会触发 onAnimationEnd 中的 onDismiss 回调,但这意味着在 CursorAdapter 使用删除更新之前,动画已运行并自行重置。

这对用户来说最终看起来像是一个闪烁,他们通过滑动删除笔记,然后 View 返回一瞬间然后消失,因为 CursorAdapter 已经拾取了数据改变。

这是我的OnDismissCallback:

private SwipeDismissList.OnDismissCallback dismissCallback = 
new SwipeDismissList.OnDismissCallback() {
@Override
public SwipeDismissList.Undoable onDismiss(ListView listView, final int position) {
Cursor c = mAdapter.getCursor();
c.moveToPosition(position);
final int id = c.getInt(Query._ID);
final Item item = Item.findById(getActivity(), id);
if (Log.LOGV) Log.v("Deleting item: " + item);

final ContentResolver cr = getActivity().getContentResolver();
cr.delete(Items.buildItemUri(id), null, null);
mAdapter.notifyDataSetChanged();

return new SwipeDismissList.Undoable() {
public void undo() {
if (Log.LOGV) Log.v("Restoring Item: " + item);
ContentValues cv = new ContentValues();
cv.put(Items._ID, item.getId());
cv.put(Items.ITEM_CONTENT, item.getContent());
cr.insert(Items.CONTENT_URI, cv);
}
};
}
};

最佳答案

我知道这个问题已被标记为“已回答”,但正如我在评论中指出的那样,使用 MatrixCursor 的问题在于效率太低。复制除要删除的行之外的所有行意味着行删除以线性时间运行(与 ListView 中的项目数成线性关系)。对于大数据和速度较慢的手机,这可能是 Not Acceptable 。

另一种方法是实现您自己的 AbstractCursor,它会忽略要删除的行。这导致假行删除在恒定时间内运行,并且在绘制时性能损失可以忽略不计。

示例实现:

public class CursorWithDelete extends AbstractCursor {

private Cursor cursor;
private int posToIgnore;

public CursorWithDelete(Cursor cursor, int posToRemove)
{
this.cursor = cursor;
this.posToIgnore = posToRemove;
}

@Override
public boolean onMove(int oldPosition, int newPosition)
{
if (newPosition < posToIgnore)
{
cursor.moveToPosition(newPosition);
}
else
{
cursor.moveToPosition(newPosition+1);
}
return true;
}

@Override
public int getCount()
{
return cursor.getCount() - 1;
}

@Override
public String[] getColumnNames()
{
return cursor.getColumnNames();
}

//etc.
//make sure to override all methods in AbstractCursor appropriately

按照之前的所有步骤进行操作,除了:

  • 在 SwipeDismissList.OnDismissCallback.onDismiss() 中,创建新的 CursorWithDelete。
  • 切换到新光标

关于android - CursorAdapter 支持的 ListView 删除动画 "flickers"删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15468100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com