0

Ich habe eine RecyclerView mit einem EditText in jeder Zeile. Jedem EditText ist ein TextWatcher und ein Objekt in einem Array zum Speichern von Informationen über die Zeile und den Wert von EditText zugeordnet. Das Problem, dem ich gegenüberstehe, ist, dass wenn die Zeile außerhalb des Bildschirms verschwindet, sie recycelt wird, aber in diesem Prozess wird onTextChanged mit einer leeren Zeichenfolge aufgerufen, was bedeutet, dass eine leere Zeichenfolge im Informationsobjekt der Zeile gespeichert wird. Wenn diese Zeile erneut geladen wird, wird nur ein leerer Wert geladen, wodurch der Inhalt gelöscht wird, der zuvor im EditText enthalten war. Dies scheint eine sehr nutzlose Funktion zu sein, denn (soweit ich das beurteilen kann) gibt es keine Möglichkeit, zwischen einem Recycling-Löschen und dem Löschen des Wertes im EditText zu unterscheiden, wodurch EditTexts in einem RecyclerView völlig nutzlos werden. dieseEditText onTextChanged mit leerem Wert auf Zeilenwiederverwendung aufgerufen werden

meine onBindViewHolder Methode ist:

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

    int value = indicators.get(position).getValue(); 

    System.out.println("VALUE: " + indicator.getValue()); 

    if (value == -1) { 
     viewHolder.inputBox.setText(""); 
    } else { 
     viewHolder.inputBox.setText(Integer.toString(value)); 
    } 

    viewHolder.editListener.updatePosition(position); 

} 

Mein TextWatcher ist dies:

private class EditBoxListener implements TextWatcher { 

    private int position; 
    private CharSequence sequence; 
    private boolean initialCall = true; 

    public void updatePosition(int _position) { 
     position = _position; 
    } 

    @Override 
    public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {} 

    @Override 
    public void onTextChanged(CharSequence charSequence, int start, int before, int count) { 

     System.out.println("TEXT CHANGED TO: " + charSequence.toString()); 

     if (!initialCall) { 
      int value = -1; 

      try { 
       value = Integer.parseInt(charSequence.toString()); 
      } catch (Exception e) {} 

      if (indicators.size() > 0) { 

       indicators.get(position).setValue(value); 

      } 
     } else { 
      initialCall = false; 
     } 
    } 

    @Override 
    public void afterTextChanged(Editable editable) {} 

} 

Antwort

0

Nun ja, eine Art und Weise, dies zu bekämpfen wäre, einfach zu prüfen, ob der Text leer ist oder nicht, bevor irgendetwas zu tun damit, vielleicht so etwas (verzeih meine schlechte Formatierung):

@Override 
public void onTextChanged(CharSequence charSequence, int start, int before, int count) { 

if (!charSequence.equals("")) { 

    System.out.println("TEXT CHANGED TO: " + charSequence.toString()); 

    if (!initialCall) { 
     int value = -1; 

     try { 
      value = Integer.parseInt(charSequence.toString()); 
     } catch (Exception e) {} 

     if (indicators.size() > 0) { 

      indicators.get(position).setValue(value); 

     } 
    } else { 
     initialCall = false; 
    } 
} 

} 
+0

Das ist kein opt ion, weil ein berechtigter Wert, den der Benutzer eingeben kann, ein leerer Wert ist. – JamEngulfer

Verwandte Themen