gpt4 book ai didi

安卓漏洞?在正确项目的项目动画期间,数据库更新后错误的行开始在 ListView 上动画

转载 作者:行者123 更新时间:2023-11-30 04:00:21 29 4
gpt4 key购买 nike

我有一个 ListView 从数据库中获取数据。单击时每行向右和向后动画如下:

@Override
public void onItemClick(AdapterView<?> av, View v, int pos, long id) {

...
pos = pos - mList.getFirstVisiblePosition();
mList.getChildAt(pos).startAnimation(anim );
...}

动画持续约 1 秒,是:向右滑出然后向后滑出

如果在动画期间没有与数据库交互,这部分工作正常

现在,列表中的每个项目在数据库中都有一个计数器。每当用户单击列表中的项目时,数据库中的计数器都应该增加,并且也会直观地显示在每个项目的 ListView 上。

所以,DB是通过ContentProvider可见的

问题是:

每当我点击一个项目时,动画就会开始,然后通过 ContentResolver 对数据库执行更新。问题是动画从正确的元素开始,但就在它开始后突然停止并在列表中的其他元素上结束。

如果列表中有四个元素

----------1----------
----------2----------
----------3----------
----------4----------

然后我单击元素 1,数字 1 开始向右滑动,但在大约 200 毫秒后它停止了,元素 4 继续从 1 停止的地方开始动画,以完成动画的其余部分

如果我按 2 可以重现,但这次 3 号完成动画。如果 3 那么 2 结束。如果我点击 4 然后点击 1。

假设只有 4 个项目可见,我可以在整个列表中重现它。

总是相反的元素。我调试了onItemClick中的位置,但是总是对的。

重要当我注释掉在数据库中进行更新的代码时,一切正常。这表明在动画过程中,当 ListView 的 SimpleCursorAdapter 通过 LoaderManager 从数据库中使用新的 Cursor 刷新时会出现问题。

我做了什么尝试使用 CommonsWare Loaderex 而不是 ContentProvider。它具有相同的效果。

代码 fragment

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 bug?或者我缺少什么?

目前解决这个问题的想法我想我的选择是阻止点击动画持续时间并在动画持续时间过后在处理程序中进行 cr.update,这样刷新就不会影响动画。

请指教

最佳答案

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

我目前的解决方案是因为我想支持 2.2 设备。我创建了这个动画的监听器。当 anim 完成时,我对数据库进行更新。我还为动画的持续时间屏蔽了 UI(大约 300 毫秒,所以没问题)

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

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

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

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

关于安卓漏洞?在正确项目的项目动画期间,数据库更新后错误的行开始在 ListView 上动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12586550/

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