2016-06-01 14 views
5

Ich habe RecyclerView .Das Element an der Position ist 0 ist Header für EditText, dann sind alle anderen Elemente images.On lange drücken auf EditText gibt es Option einfügen. Das funktioniert gut. Aber wenn ich Scroll die Recycler-Ansicht nach unten und wieder nach oben und lange drücken, wird es nicht zeigen, die Option Einfügen und gibt Fehler. Beim Scrollen nach unten und wieder nach oben kommt Anruf an onBindViewHolder.EditText gibt Fehler: TextView unterstützt keine Textauswahl. Auswahl abgebrochen

TextView: TextView unterstützt keine Textauswahl. Auswahl abgebrochen

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

poste bitte deinen Code! –

+0

Ineed den Layoutcode und die Header des Adapters und der Zeile. Um festzustellen, Fehler –

+0

getan .. ich kann verschiedene Probleme für die gleiche, aber keine Lösung. –

Antwort

4

Mit MyEditText.java können sich Ihr Problem lösen:

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

Eigentlich hat es 3 Stunden gedauert, das zu versuchen, weil es nicht so aussah, als ob es überhaupt mit dem Problem zusammenhing. Aber es funktioniert! –

+0

Ein langer Klick auf EditText ruft Editor.performLongClick() auf, um das Auswahlfenster zu öffnen. – Lucca

9

Dies ist a known bug in the Android platform. Ich habe es zuerst nicht geglaubt, aber der Code @ user2246055 ist ein effektiver Workaround!

I bevorzugt diese statt Subklassifizieren Textview in meinem Adapter hinzuzufügen:

 @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

Vielen Dank dafür! Ich hatte das gleiche Problem und Ihre Lösung hat mir geholfen. (auf Android 7.1 übrigens) –

+0

Das funktionierte für mich. = D – benjtupas

1

Lange auf EditText wird Editor.performLongClick() rufen Auswahl Popup-Fenster zu zeigen.

Vor getInsertionController().show();

es mInsertionControllerEnabled überprüfen, wenn Sie setText() verwenden, werden Textview Editor.prepareCursorControllers() rufen mInsertionControllerEnabled wie folgt zurück:

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

wie Sie sehen, rootView muss Fenstertyp sein oder mInsertionControllerEnabled wird false.

Aber wenn man setText() bei onBindViewHolder(), die EditText nicht attachToWindow noch ist, also sollten wir setEnable() nach EditText attachToWindow zu zwingen Editor zurückgesetzt mInsertionControllerEnabled value.Then Auswahl jetzt funktioniert.

Verwandte Themen