在RecyclerView中回收视图后,长时间按下EditText(或android.support.v7.widget.AppCompatEditText)

问题描述 投票:2回答:1

Bug summary

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

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

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

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


Steps to reproduce

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

Expected behavior

在视图被回收之后,我们预计步骤4仍将与步骤1完全相同。


Source code

https://github.com/yccheok/edittext_bug_in_android9


Issue tracker

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


我在想,有没有人像我一样遇到同样的问题?你对此有什么好的解决方法吗?请注意,我需要我的RecyclerView项目可循环使用。因此,使用setIsRecyclable(false);不是我的选择。

android android-recyclerview android-edittext
1个回答
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(博客中文)

© www.soinside.com 2019 - 2024. All rights reserved.