每次移除一个项目时,RecyclerView 最后一个项目都会闪烁

jac*_*314 2 android android-contentresolver android-contentprovider android-cursorloader android-recyclerview

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

最后一项闪烁

我的删除代码是

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

刷卡代码:

deleteData(viewHolder.getItemId());
Run Code Online (Sandbox Code Playgroud)

请注意,我有一个使用相同的另一个活动RecyclerAdapterContentProvider甚至大多数的实现和方法途径和布局代码,都是一样的,但一个完美的作品没有任何闪烁,所以这对我来说是很奇怪的情况。

是否有可能导致此问题的特定原因?我已经尝试禁用动画

recyclerView.getItemAnimator().setChangeDuration(0);
Run Code Online (Sandbox Code Playgroud)

或者

((DefaultItemAnimator) recyclerViewObject.getItemAnimator()).setSupportsChangeAnimations(false);
Run Code Online (Sandbox Code Playgroud)

但这些都没有奏效,更不用说我确实希望动画正常工作。

编辑:断点上传:

在创建:

"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) 在 com.jackz314.todo.HistoryActivity.deleteExpiredNotes(HistoryActivity.java:767) 在 com.jackz314.todo.HistoryActivity.onCreate(HistoryActivity.java:129)
在 android.app.Activity.performCreate(Activity.java:6975) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) 在 android.app。 ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(ActivityThread.java:-1) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
在 android.os.Handler.dispatchMessage(Handler.java:105) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 java.lang。 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 处的reflect.Method.invoke(Method.java:-1) 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) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 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删除最初应该删除的项目。我仍在研究它,试图弄清楚是因为我在某个地方弄乱了订单还是其他原因。

jac*_*314 6

终于拿到了!

还有一个愚蠢的错误,一点也不复杂,我一直在想,为什么我只有这个活动有这个问题,而不是我以前的活动,我突然意识到这两个活动的布局不同,结果是我将RecyclerView的高度设置为wrap_content,所以我想发生的事情是,布局告诉系统将内容包装在 中RecyclerView,当你删除一个项目时,它在技术上不再存在,所以,即使我有被删除的动画item,该 item 立即从布局的 level 中删除,这就是为什么 Android 似乎RecyclerView先调整了's height,然后删除了 item,实际发生的情况是,因为RecyclerView设置为wrap_content,它在删除后立即删除视图(项目)的位置,而不是在动画之后,这就是为什么它看起来像眨眼。

无论如何,解决方案只是将RecyclerView的高度从更改wrap_content为任何其他值,如果您ConstraintLayout像我一样使用,只需将高度更改为0dp,然后将 约束RecyclerView为其他东西或边缘。

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

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