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)
我知道这个问题被标记为"已回答",但正如我在评论中指出的那样,使用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)
按照以前的所有步骤操作,除了:
| 归档时间: |
|
| 查看次数: |
5337 次 |
| 最近记录: |