2016-06-01 13 views
5

Ho RecyclerView. L'elemento in posizione è 0 è intestazione per EditText, quindi tutti gli altri elementi sono immagini.Premendo a lungo su EditText, l'opzione incolla.Questo funziona correttamente. Ma quando faccio scorrere verso il basso la vista del riciclatore e di nuovo in alto, premo a lungo per non mostrare l'opzione Incolla e dà errore. On Scorrendo verso il basso e di nuovo in cima passa la chiamata a onBindViewHolder.Errore di modifica del testo: TextView non supporta la selezione del testo. Selezione annullata

TextView: TextView non supporta la selezione del testo. Selezione annullata.

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

inserisci il tuo codice per favore! –

+0

anche l'adattatore e il codice di layout e le intestazioni della riga. Per determinare l'errore –

+0

done..i posso trovare vari problemi presentati per lo stesso, ma nessuna soluzione. –

risposta

4

Utilizzando seguente MyEditText.java in grado di risolvere il 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); 
}} 
+0

In realtà, mi ci sono volute 3 ore per provarlo perché non sembrava essere correlato al problema A TUTTI. Ma funziona! –

+0

Fare clic su EditText per chiamare Editor.performLongClick() per visualizzare la finestra di popup di selezione. – Lucca

9

Questo è a known bug in the Android platform. All'inizio non ci credevo, ma il codice @ user2246055 pubblicato è una soluzione efficace!

ho preferito aggiungere questo nel mio adattatore invece di subclassing 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); 
     } 
+0

Grazie mille per questo! Stavo vivendo lo stesso problema e la tua soluzione mi ha aiutato. (su Android 7.1 tra l'altro) –

+0

Questo ha funzionato per me. = D – benjtupas

1

lungo click sul EditText chiamerà Editor.performLongClick() finestra pop-up di selezione per mostrare.

Prima getInsertionController().show();

controllerà mInsertionControllerEnabled, quando si utilizza setText(), TextView chiamerà Editor.prepareCursorControllers() per ripristinare mInsertionControllerEnabled in questo modo:

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

come vedete, rootView devono essere di tipo finestra o mInsertionControllerEnabled sarà false.

Ma quando si setText() in onBindViewHolder(), il EditText non è attachToWindow ancora, quindi dovremmo setEnable() dopo EditText attachToWindow per forzare Editor ripristinare mInsertionControllerEnabled selezione value.Then funzionerà ora.

Problemi correlati