android - 在 RecyclerView 中回收 View 后,EditText(或 android.support.v7.widget.AppCompatEditText)长按损坏

标签 android android-recyclerview android-edittext

错误总结

EditTextRecyclerView 中被回收后,它的长按行为,用于选择所有文本,并显示上下文菜单“剪切/复制/粘贴”,不再按预期工作。

从Android 15到Android 28都会出现这个问题。

我尝试了 EditTextandroid.support.v7.widget.AppCompatEditText。两者都会产生同样的问题。

我可以确认这个问题发生在 View 被回收之后。如果我在 ViewHolder 中应用 setIsRecyclable(false);,就不会出现这个问题。


重现步骤

  1. 长按第一个 EditText。我们可以确认 EditText 中的所有文本都将被选中。将显示上下文菜单。
  2. 滚动 RecyclerView 直到列表末尾。
  3. 滚动 RecyclerView 直到列表的开头。
  4. 长按第一个 EditTextEditText 中的所有文本都不会被选中。不会显示上下文菜单。

预期行为

在 View 被回收后,我们预计第 4 步的行为仍将与第 1 步完全相同。


源代码

https://github.com/yccheok/edittext_bug_in_android9


问题跟踪器

https://issuetracker.google.com/issues/125425940


我想知道,有没有人遇到和我一样的问题?您对此有什么好的解决方法吗?请注意,我需要我的 RecyclerView 项目是可回收的。因此,使用 setIsRecyclable(false); 不是我的选择。

最佳答案

简而言之,问题的发生是因为 EditTextattachToWindow 期间没有执行 Editor#prepareCursorControllers

由于 Editor#prepareCursorControllers 不是公共(public)可访问函数,我们可以使用 setCursorVisible 间接调用它。

edtImgDesc.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
     @Override
     public void onViewAttachedToWindow(View v) {
         edtImgDesc.setCursorVisible(false);
         edtImgDesc.setCursorVisible(true);
     }

     @Override
     public void onViewDetachedFromWindow(View v) {
     }
 });

引用来源:https://www.jianshu.com/p/e334134a4ef7 (博客是中文的)

关于android - 在 RecyclerView 中回收 View 后,EditText(或 android.support.v7.widget.AppCompatEditText)长按损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54833004/

相关文章:

android - 使用 .NET 和 Visual Studio 2017 开发 Android OpenGL ES 应用程序

安卓文件夹监控

android - 提醒申请

android - : Can't access the Fragment View's LifecycleOwner when getView() is null i. 即,在 onCreateView() 之前或 onDestroyView() 之后

Android - 弹出键盘时调整屏幕?

java - NullPointerException:键== null ||值==空

android - RecyclerView onclick 不显示波纹效果或突出显示

android - RecyclerView中notifyDataSetChanged时如何使指定项不更新

java - 如何清除edittext中的文字

Android - 键盘覆盖阿拉伯语/RTL 中的 EditText