在RecyclerView中回收视图后,EditText(或android.support.v7.widget.AppCompatEditText)长按断开 错误摘要

在RecyclerView中回收视图后,EditText(或android.support.v7.widget.AppCompatEditText)长按断开 错误摘要,android,android-recyclerview,android-edittext,Android,Android Recyclerview,Android Edittext,在EditText在RecyclerView中被回收后,其用于选择所有文本并显示上下文菜单“剪切/复制/粘贴”的长按行为不再按预期工作 这个问题发生在Android 15到Android 28之间 我尝试了EditText和android.support.v7.widget.appcompatiedittext。两者都会产生相同的问题 我可以确认在回收视图后出现此问题。如果我应用setIsRecyclable(false)在ViewHolder中,不会出现问题 复制步骤 长按第1次编辑文本。我

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

这个问题发生在Android 15到Android 28之间

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

我可以确认在回收
视图
后出现此问题。如果我应用
setIsRecyclable(false)
ViewHolder
中,不会出现问题


复制步骤
  • 长按第1次编辑文本。我们可以确认将选择
    EditText
    中的所有文本。将显示关联菜单
  • 滚动
    RecyclerView
    直到列表结束
  • 滚动
    RecyclerView
    直到列表开始
  • 长按第1次编辑文本。将不会选择编辑文本中的所有文本。关联菜单将不显示

  • 预期行为 在视图被回收后,我们希望步骤4的行为仍然与步骤1完全相同


    源代码


    问题追踪器



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

    简而言之,问题的发生是因为
    EditText
    attachToWindow
    过程中不执行
    Editor#preparecursorcontroller

    由于
    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) {
         }
     });
    
    参考资料来源:(该博客为中文)