CursorAdapter支持ListView删除动画"闪烁"删除

rha*_*ter 14 android android-animation android-listview

我正在尝试实现滑动删除和ListView使用SwipeToDismissUndoList库扩展Roman Nurik的SwipeToDismiss示例.

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

这最终看起来像是一个闪烁的用户,他们通过滑动它删除一个音符,然后视图返回一瞬间然后消失,因为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);
            }
        };
    }
};
Run Code Online (Sandbox Code Playgroud)

U A*_*los 6

我知道这个问题被标记为"已回答",但正如我在评论中指出的那样,使用MatrixCursor的问题在于效率太低.复制除要删除的行之外的所有行意味着行删除以线性时间运行(列表视图中的项目数为线性).对于大数据和较慢的手机,这可能是不可接受的.

另一种方法是实现自己的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
Run Code Online (Sandbox Code Playgroud)

按照以前的所有步骤操作,除了:

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

  • 这是CursorWrapper的代码片段:http://chopapp.com/#ifj74ch4 (3认同)