1

我有一个从数据库中获取数据的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,这样刷新就不会影响动画。

请指教

4

1 回答 1

1

我现在可以确认: 该行为仅发生在我的 2.2 设备上。并且可以复制。它在 Android 4.1 设备上工作正常(当 bg 中的行更新时动画正确完成)并且可以重现。

我目前对此的解决方案是 因为我想支持 2.2 设备。我创建了这个动画的监听器。完成anim后,我对 db 进行更新。我还阻止了动画持续时间的 UI(大约 300 毫秒,所以很好)

注意 - 这看起来像 Android SDK 问题

至于更新问题和使用 forceLoad 在我的内容提供程序实现中,我必须在我的查询方法中添加它:

cursor.setNotificationUri(getContext().getContentResolver(), uri);

正在将此 uri 注册到 ContentResolver。现在它可以在不使用 forceLoad 的情况下正常工作

于 2012-10-02T08:19:12.940 回答