我有一个从数据库中获取数据的ListView 。单击时,每一行都会向右和向后移动,如下所示:
@Override
public void onItemClick(AdapterView<?> av, View v, int pos, long id) {
...
pos = pos - mList.getFirstVisiblePosition();
mList.getChildAt(pos).startAnimation(anim );
...}
动画持续约 1 秒,是:向右滑出然后向后滑
如果动画期间没有与 DB 交互,这部分工作正常
现在,列表中的每个项目在 DB 中都有一个计数器。每当用户单击列表中的项目时,应在 DB 中增加计数器,并且每个项目的 ListView 上也会直观地呈现。
因此,通过 ContentProvider 可以看到 DB
这是问题:
每当我单击一个项目时,动画就会开始,然后通过 ContentResolver 对 DB 执行更新。问题是动画从正确的元素开始,但就在它开始后突然停止并在列表中的其他元素上结束。
所以如果我在列表中有四个元素
----------1----------
----------2----------
----------3----------
----------4----------
然后我单击元素 1,数字 1 开始向右滑动,但在大约 200 毫秒后它停止并且元素 4 继续从 1 在动画的其余部分停止的地方开始动画
如果我按 2 也可以重现,但这次数字 3 完成动画。如果 3 则 2 完成。如果我点击 4 然后 1。
假设只有 4 个项目是可见的,我可以通过整个列表重现它。
它总是相反的元素。我在onItemClick 中调试位置,但它总是正确的。
重要 当我注释掉在数据库中进行更新的代码时,一切正常。这表明当 ListView 的 SimpleCursorAdapter 在动画期间通过数据库中的 LoaderManager 使用新的 Cursor 刷新时会出现问题。
我做了什么尝试 使用 CommonsWare Loaderex 而不是 ContentProvider。它给出了相同的效果。
代码片段
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
return new CursorLoader(this.getActivity(), MyContentProvider.CONTENT_URI,
new String[]{}, "uid>0 AND distance<80000", null, "distance LIMIT 100");
}
public void onLoadFinished(Loader<Cursor> ld, Cursor c) {
merchantAdapter.swapCursor(c);
}
OnItemClick 有这个代码:
ContentResolver cr = getActivity().getContentResolver();
ContentValues cv = new ContentValues();
cv.put("counter", counter);
Uri mUri = ContentUris.withAppendedId(MyContentProvider.CONTENT_URI, uid);
cr.update(mUri, cv, null, null);
还有什么让我烦恼的是,我无法让 LoaderManager 自动为我更新列表,所以在上面 cr.update(...
我这样做是为了在每次更新后刷新列表
getActivity()).lm.getLoader(0).forceLoad();
动画问题可能是Android错误吗?或者我错过了什么?
目前解决这个问题的想法 我想我的选择是阻止动画持续时间的点击,并在动画持续时间过去后在处理程序中进行 cr.update,这样刷新就不会影响动画。
请指教