EditText дает ошибку: TextView не поддерживает выделение текста. Выбор отменен

я имеюRecyclerView. Элемент в позиции 0 является заголовком дляEditText , то все остальные элементы являются изображениями. При длительном нажатии наEditText Это дает возможность вставлять. Это прекрасно работает. Но когда я прокручиваю вид рециркулятора вниз и снова поднимаюсь вверх и продолжительное нажатие, он не показывает опцию вставки и выдает ошибку. При прокрутке до дна и повторном переходе к верху проходит вызовonBindViewHolder.

TextView: TextView не поддерживает выделение текста. Выбор отменен.

public class Someclass extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {


    private static final int TYPE_EDIT = 0;
    private static final int TYPE_IMAGE = 1;
    List<String> msomelist = new ArrayList<String>();

    public void someMethod(List<String> somelist) {

        msomelist.clear();
        msomelist.addAll(somelist);
        notifyDataSetChanged();

    }




    public Someclass(Activity activity, List<String> somelist) {
        this.activity = activity;
        this.msomelist.clear();
        this.msomelist.addAll(somelist);
        mContext = activity;
    }

    @Override
    public int getItemViewType(int position) {

        if (position == 0)
            return TYPE_EDIT;

        return TYPE_IMAGE;
    }

    @Override
    public void onClick(View view) {
        int postition = (int) view.getTag();
        msomelist.remove(postition);
        notifyDataSetChanged();

    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
       ImageView img;

        public ViewHolder(View itemView) {
            super(itemView);

            img = (ImageView) itemView.findViewById(R.id.image);
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_IMAGE) {
            View view = LayoutInflater.from(mContext)
                    .inflate(somelayout, false);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        } else {
            View view = LayoutInflater.from(mContext)
                    .inflate(someotherlayout, false);


            return new OtherHolder(view);
        }
    }

    class OtherHolder extends RecyclerView.ViewHolder {
        EditText editText;

        public OtherHolder(View itemView) {
            super(itemView);
            editText = (EditText) itemView.findViewById(R.id.ediItext);
            editText.requestFocus();
        }
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {

        if (holder instanceof ViewHolder) {
            some function.....
        } else if (holder instanceof OtherHolder) {
            some function
        }
    }
}
 Yasin Kaçmaz01 июн. 2016 г., 13:01
Кроме того, вы можете использовать свой адаптер, код компоновки строки и заголовки. Определить ошибку
 BOUTERBIAT Oualid01 июн. 2016 г., 12:40
опубликуйте свой код, пожалуйста!
 stack Learner01 июн. 2016 г., 13:48
сделано .. я могу найти различные проблемы, поданные за то же самое, но без решения.

Ответы на вопрос(3)

Этоизвестная ошибка в платформе Android, Сначала я не поверил, но код @ user2246055 - эффективный обходной путь!

Я предпочел добавить это в моем адаптере вместо создания подкласса TextView:

        @Override
        public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
            super.onViewAttachedToWindow(holder);

            // Bug workaround for losing text selection ability, see:
            // https://code.google.com/p/android/issues/detail?id=208169
            holder.textView.setEnabled(false);
            holder.textView.setEnabled(true);
        }
 Bernd Kampl28 окт. 2016 г., 11:13
Большое спасибо за это! Я столкнулся с той же проблемой, и ваше решение помогло мне. (на Android 7.1 кстати)
 benjtupas01 нояб. 2016 г., 03:06
Это сработало для меня. = D
 Sasha Shpota09 окт. 2018 г., 16:31
Не могли бы вы рассказать об этом немного? Где вы это добавите? Какой класс вы переопределяете? И как вы используете этот класс в коде?

Длинный клик поEditText позвонюEditor.performLongClick() показать всплывающее окно выбора.

ДоgetInsertionController().show();

это проверитmInsertionControllerEnabledкогда вы используетеsetText(), TextView будет вызыватьEditor.prepareCursorControllers() сброситьmInsertionControllerEnabled как это:

boolean windowSupportsHandles = false;

ViewGroup.LayoutParams params = mTextView.getRootView().getLayoutParams();
if (params instanceof WindowManager.LayoutParams) {
    WindowManager.LayoutParams windowParams = (WindowManager.LayoutParams) params;
    windowSupportsHandles = windowParams.type < WindowManager.LayoutParams.FIRST_SUB_WINDOW
            || windowParams.type > WindowManager.LayoutParams.LAST_SUB_WINDOW;
}

boolean enabled = windowSupportsHandles && mTextView.getLayout() != null;
mInsertionControllerEnabled = enabled && isCursorVisible();

как вы видите,rootView должен быть тип окна илиmInsertionControllerEnabled будетfalse.

Но когда тыsetText() вonBindViewHolder(),EditText не являетсяattachToWindow тем не менее, поэтому мы должныsetEnable() послеEditText attachToWindow для принудительного сброса редактораmInsertionControllerEnabled Значение. Затем выбор будет работать.

 c-an12 дек. 2018 г., 16:21
кудаmInsertionControllerEnabled а такжеisCursorVisible() родом из?

Используя следующееMyEditText.java может решить вашу проблему:

public class MyEditText extends EditText {
private boolean mEnabled; // is this edittext enabled

public MyEditText(Context context) {
    super(context);
}

public MyEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public MyEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    try {
        if (!mEnabled) return;
        super.setEnabled(false);
        super.setEnabled(mEnabled);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void setEnabled(boolean enabled) {
    this.mEnabled = enabled;
    super.setEnabled(enabled);
}}
 Lisa Wray19 окт. 2016 г., 22:15
На самом деле, мне понадобилось 3 часа, чтобы попробовать это, потому что это не выглядело так, как будто это было связано с проблемой вообще. Но это работает!
 Lucca06 нояб. 2016 г., 18:28
Длительное нажатие на EditText вызовет Editor.performLongClick (), чтобы отобразить всплывающее окно выбора.

Ваш ответ на вопрос