android - 每次删除项目时,RecyclerView 最后一项都会闪烁

标签 android android-recyclerview android-contentprovider android-contentresolver android-cursorloader

我在 RecyclerView 中使用游标加载器,其他一切正常,除了每次我从 RecyclerView 中删除一个项目时,最后一个项目会闪烁,就像这样

last item blinks

我的删除代码是

public void deleteData(long id){
    Uri uri = ContentUris.withAppendedId(URI, id);
    getContentResolver().delete(uri, null, null);
}

滑动代码:

deleteData(viewHolder.getItemId());

请注意,我有另一个 Activity 使用相同的 RecyclerAdapterContentProvider 和布局代码,甚至大多数实现和方法方法都是相同的,但那个有效完全没有眨眼,所以这对我来说是一个很奇怪的情况。

是否有特定原因会导致此问题?我已经试过像这样禁用动画

recyclerView.getItemAnimator().setChangeDuration(0);

((DefaultItemAnimator) recyclerViewObject.getItemAnimator()).setSupportsChangeAnimations(false);

但这些都不起作用,更不用说我确实希望动画能起作用。

编辑:断点上传:

创建时:

"main@4668" prio=5 tid=0x2 nid=NA runnable java.lang.Thread.State: RUNNABLE at com.jackz314.todo.HistoryActivity.onCreateLoader(HistoryActivity.java:803) at android.support.v4.app.LoaderManagerImpl.createLoader(LoaderManager.java:539) at android.support.v4.app.LoaderManagerImpl.createAndInstallLoader(LoaderManager.java:548) at android.support.v4.app.LoaderManagerImpl.initLoader(LoaderManager.java:603) at com.jackz314.todo.HistoryActivity.displayAllNotes(HistoryActivity.java:394) at com.jackz314.todo.HistoryActivity.deleteExpiredNotes(HistoryActivity.java:767) at com.jackz314.todo.HistoryActivity.onCreate(HistoryActivity.java:129)
at android.app.Activity.performCreate(Activity.java:6975) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(ActivityThread.java:-1) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Method.java:-1) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

onDelete(删除项目):

"main@4668" prio=5 tid=0x2 nid=NA runnable java.lang.Thread.State: RUNNABLE at com.jackz314.todo.HistoryActivity.deleteData(HistoryActivity.java:791) at com.jackz314.todo.HistoryActivity$4.onSwiped(HistoryActivity.java:434) at android.support.v7.widget.helper.ItemTouchHelper$4.run(ItemTouchHelper.java:686) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Method.java:-1) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

希望对你有帮助

编辑:经过一些调查,我发现最后一项实际上并没有闪烁,似乎 RecyclerView 首先改变了它的长度/大小,削减关闭与已删除项大小相同的部分(删除),以便最后一项(取决于已删除项的大小)暂时不可见,然后 RecyclerView 删除应该在开头删除的项目。我仍在研究它,试图弄清楚这是因为我在某处弄乱了顺序还是其他原因。

最佳答案

终于明白了!

又是一个愚蠢的错误,一点都不复杂,我一直在想,为什么我只有这个 Activity 有这个问题,而我以前的没有,我突然意识到两个 Activity 中的布局是不同的,结果是我将 RecyclerView 的高度设置为 wrap_content,所以我想发生的事情是,布局告诉系统将内容包装在 RecyclerView,当你删除一个项目时,它在技术上不再存在,所以,即使我有删除项目的动画,项目也会立即从布局级别删除,这就是为什么 Android 似乎调整了 RecyclerView 的高度,然后删除项目,实际发生的是,由于 RecyclerView 设置为 wrap_content,它删除了 View 的位置( item)在删除后立即执行,而不是在动画后执行,这就是它看起来像眨眼的原因。

无论如何,如果您正在使用 ConstraintLayout,解决方案就是将 RecyclerView 的高度从 wrap_content 更改为任何其他值像我一样,只需将高度更改为 0dp,然后将 RecyclerView 限制为其他内容或边缘。

感谢所有试图帮助我解决问题的人,我承认这是我遇到过的最愚蠢但最令人沮丧的问题之一。

我相信还有其他人也遇到了同样的问题,所以去检查高度是否设置为wrap_content

关于android - 每次删除项目时,RecyclerView 最后一项都会闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46270791/

相关文章:

android - 免费提供应用程序,但仍然向用户收取服务/使用费用的方法?

Android - 下载多个文件或包含所有文件的 zip

android - 这是通过 onActivityResult 从设备管理员获取响应的正确方法吗

android - 调用 onResume 时 viewpager 滞后中的 RecyclerView

android - 滚动到完整 View ,其中包含回收器 View

android - 号码代替铃声名称

android - 当我按回车键或屏幕上的其他任何地方时,如何失去对文本字段的关注?

java - Firebase 数据库 : can't download image

Android CursorLoader 不响应 ContentProvider 通知

android - 从联系人内容提供商 "Failure delivering result"获取联系人