EditText que da error: TextView no admite selección de texto. Selección cancelada

Tengo RecyclerView . El elemento en la posición es 0 es encabezado para EditText , entonces todos los otros elementos son images.On presionando largo en EditText da la opción paste.This trabaja muy bien. Pero cuando se desplaza la vista de reciclar a la parte inferior y de nuevo vienen a la parte superior y la prensa de largo no mostrará la opción de pegar y da error. En Desplazamiento hacia abajo y de nuevo llegando a la parte superior pasa la llamada a onBindViewHolder .

TextView : TextView no admite selección de texto. Selección cancelada.

 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 } } } 

Este es un error conocido en la plataforma Android . No lo creí al principio, pero el código @ user2246055 publicado es una solución efectiva!

He preferido añadir esto en mi adaptador en lugar de subclase 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); } 

El uso de MyEditText.java siguiente puede resolver su problema:

 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); }} 

Un clic largo en EditText llamará a Editor.performLongClick() para mostrar la ventana emergente de la selección.

Antes de getInsertionController().show();

Comprobará mInsertionControllerEnabled , cuando utilice setText() , TextView llamará a Editor.prepareCursorControllers() para restablecer mInsertionControllerEnabled siguiente manera:

 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(); 

Como ve, rootView debe ser de tipo de ventana o mInsertionControllerEnabled será false .

Pero cuando setText () en onBindViewHolder (), el EditText no es attachToWindow todavía, por lo que debemos setEnable () después de EditText attachToWindow para forzar el Editor a restablecer mInsertionControllerEnabled selección funcionará ahora.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.