在RecyclerView中回收视图后,长按破碎的EditText(或android.support.v7.widget.AppCompatEditText)

时间:2019-02-22 18:22:33

标签: android android-recyclerview android-edittext

错误摘要

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

从Android 15到Android 28,都会出现此问题。

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

我可以确认在回收View之后会发生此问题。如果我在setIsRecyclable(false);中应用ViewHolder,则不会发生此问题。


复制步骤

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

预期行为

在回收视图之后,我们希望步骤4的行为仍与步骤1完全相同。


源代码

https://github.com/yccheok/edittext_bug_in_android9


问题跟踪器

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


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

1 个答案:

答案 0 :(得分:2)

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

由于Editor#prepareCursorControllers不是公共可访问函数,因此我们可以使用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(博客为中文)