2013-06-30 22 views
9

Ich habe eine Listview in meiner Anwendung, die im Grunde ein Fragebogen ist, so gibt es einige EditTexte, die der Benutzer ausfüllen muss. Ich habe folgende Probleme aufgetreten:Android: EditText in ListView Ausgabe

  1. Einige der EditText erfordern numerische Eingabe, so stelle ich die input in der entsprechenden XML-Typ als numerische jedoch, wie wenn ich auf dem EditText die numerische Tastatur angezeigt wird aber fast sofort verschwindet es und die normale Tastatur wird angezeigt.

  2. Wie Sie sich vorstellen können, muss ich die Werte speichern, die der Benutzer in diesen EditTexts eingibt. Das Problem, das ich damit habe, ist, dass, nachdem ich etwas Text in EINIGEN EditTexts eingegeben habe und ich nach unten scrolle, der Text weg ist, wenn ich zurück gehe. Sie können in meinem Code sehen, dass ich versucht habe, dies zu verhindern, und ich sollte erwähnen, dass es mit Checkboxen perfekt funktioniert.

  3. Am Anfang hatte ich Probleme mit dem Fokus zu verlieren, aber ich löste es mit Blick auf andere Fragen (hinzugefügt abcendantFocusablity = "beforeDescendants" in die ListView und windowSoftInputMode = "adjustPan"). Funktioniert gut außer, wenn ein EditText unterhalb der Hälfte des Bildschirms ist, verliert es den Fokus, sobald ich anfange, in es einzugeben. getView Verfahren zur Liste Adapter:

    public View getView(final int position,View result,ViewGroup parent) 
    { 
    final ViewHolder vh; 
    final Question question = values.get(position); 
    if(holders[position]==null) 
        vh = new ViewHolder(); 
    else 
        vh = holders[position]; 
    
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if(question.getQuestionType().equals(Question.TYPE_CLOSED)) 
    { 
        result = inflater.inflate(R.layout.closed_question_list_item, null); 
        vh.cb = (CheckBox)result.findViewById(R.id.checkbox); 
        vh.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() 
        { 
    
         @Override 
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
         { 
          vh.isChecked  = isChecked; 
          holders[position] = vh; 
         } 
        }); 
        vh.cb.setChecked(vh.isChecked); 
    } 
    
    else 
    { 
        result = inflater.inflate(R.layout.numeric_question_list_item, null); 
        vh.et = (EditText)result.findViewById(R.id.question_et); 
        vh.et.addTextChangedListener(new TextWatcher() 
        { 
         @Override 
         public void afterTextChanged(Editable s) 
         { 
          vh.tvValue = s.toString(); 
          holders[position] = vh; 
          Log.i(TAG,"Entered afterTextChanged for "+ question.getText()); 
         } 
    
         @Override 
         public void beforeTextChanged(CharSequence s, int start,int count, int after) 
         { 
         } 
    
         @Override 
         public void onTextChanged(CharSequence s, int start,int before, int count) 
         { 
         } 
        }); 
        vh.et.setText(vh.tvValue); 
    } 
    vh.tv = (TextView)result.findViewById(R.id.question_text); 
    
    vh.tv.setText(question.getText()); 
    
    holders[position] = vh; 
    result.setTag(vh); 
    return result; 
    } 
    
+0

vielleicht dies können Sie http://stackoverflow.com/questions/8772714/edittext-loses-content-on-scroll-in-listview?rq=1 – JahShaka

+0

helfen, wie Sie Ausgabe # 3 gelöst haben? Wenn gelöst, bitte posten Sie die Antwort – desidigitalnomad

Antwort

0

wegen auf Frage 2 Sie zu diesem Beitrag EditText items in a scrolling list lose their changes when scrolled off the screen so scheint es gibt s keine einfache Lösung, um die edittexts bestehen bleiben, wenn Sie

nach unten scrollen beziehen können

Ja rechten Seite können Sie versuchen,

EditText loses content on scroll in ListView

oder einfach nur auf die entsprechenden Stellen auf der rechten Seite

+1

Danke, aber die ganze Antwort sagt Ihnen, die Zeilen selbst zu recyceln, aber es erklärt nicht, wie man es effektiv macht, was ich wissen will. Würdest du zufällig wissen, wo ich so etwas finden kann? – user2535545

+0

http://stackoverflow.com/questions/8772714/edittext-loses-content-on-scroll-in-listview?rq=1 – JahShaka

+0

Vielen Dank, ich werde es mir ansehen. Wie auch immer, ich schaffte es, es zu lösen, stellte sich heraus, dass die Variable vh local verwendet wurde und das Halters Array war irgendwie redundant, also habe ich versucht, all diese Redundanz zu entfernen und es funktionierte gut. – user2535545

18

Lösungen beziehen 3 # zur Ausgabe:

  1. descendantFocusablity="beforeDescendants" in der Listenansicht ein.

  2. Set windowSoftInputMode="adjustPan" im Manifest

  3. Set listview.setItemsCanFocus(true)

+0

Ihre Lösung ist die einzige, die tatsächlich funktioniert! Vielen Dank! – Valdrinit

+0

Sie haben einen Job gemacht Mann. Vielen Dank!!! –

+1

Danke. 1. android: demcendantFocusability = "afterDescendants". 2. Schreiben Sie eine Speicherung des eingegebenen Textes wie hier: http://stackoverflow.com/a/19487574/2914140 oder hier: http://stackoverflow.com/a/21404201/2914140. – CoolMind

4

auf aaRBiyecH ‚s Antwort zu erweitern above, hier ist eine Lösung und eine tiefe gehende Erklärung auf Ihre Fragen # 1 und # 3 (source):

Sie müssen die Eigenschaft DescendantFocusability Ihres ListView auf "afterDescendants" setzen.

Sie können dies wie folgt in der XML tun:

android:descendantFocusability="afterDescendants"

oder in Code wie folgt:

listview.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS)

Sie müssen auch fokussierbar sein, um die Elemente zu setzen.

Sie können dies in dem Code wie folgt tun: listview.setItemsCanFocus(true);

Außerdem müssen Sie angeben, was mit dem Hauptfenster Ihrer Aktivität passiert, wenn die Bildschirmtastatur angezeigt wird. Dies geschieht, indem das Attribut WindowSoftInputMode geändert wird. Wahrscheinlich möchten Sie es auf AdjustPan setzen, damit Ihre Listenansicht nicht in der Größe geändert wird und GetView nicht erneut aufgerufen wird. Dies ist wahrscheinlich, was passiert, wenn Sie jetzt die Tastatur verstecken, GetView wird erneut aufgerufen und den ursprünglichen Wert im EditText zurückgesetzt.

Sie können dies mithilfe des Attributs android:windowSoftInputMode="adjustPan" für das XML Ihrer Hauptaktivitätsklasse oder getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_PAN) programmgesteuert tun.

0

Sein für mich arbeiten .... Bitte überprüfen Sie diese

listview.setItemsCanFocus(true); 
0

ich eine Listenansicht mit EditText haben und wenn ich Eingabe von Text in es, wenn vor diesem, ich die Listenansicht bewegen, nehmen Sie den Adapter einige Positionen , nicht das ausgewählte.

Mein Adapter verschiedenen Positionen statt meiner Auswahl nehmen:

etCantidad.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) {} 

    @Override 
    public void afterTextChanged(Editable s) { 
     String cantidadTMP = etCantidad.getText().toString(); 
     int cantidad; 
     try { 
       cantidad = Integer.parseInt(cantidadTMP); 
       item.setCantidad(cantidad); 
       Log.i("Name",""+item.getNombre()); 
      }catch (Exception e){ 
        cantidad = 0; 
      } 
     Log.i("QuantityArrayAdapter",String.valueOf(cantidad)); 
    }}); 

One EditExt Auswahl:

09-25 09:22:10.458 12719-12719/? I/QuantityArrayAdapter: 1 
09-25 09:22:10.458 12719-12719/? I/QuantityArrayAdapter: 1 
09-25 09:22:10.458 12719-12719/? I/QuantityArrayAdapter: 1 

Also, habe ich diese Methode in die onTouchListener zu bekommt nur die Auswahlposition:

etCantidad.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      etCantidad.addTextChangedListener(new TextWatcher() { 
       @Override 
       public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

       } 

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

       @Override 
       public void afterTextChanged(Editable s) { 
        String cantidadTMP = etCantidad.getText().toString(); 
        int cantidad; 
        try { 
         cantidad = Integer.parseInt(cantidadTMP); 
         item.setCantidad(cantidad); 
         Log.i("Name",""+item.getNombre()); 
        }catch (Exception e){ 
         cantidad = 0; 
        } 
        Log.i("QuantityArrayAdapter",String.valueOf(cantidad)); 
       } 
      }); 
      return false; 
     } 
    }); 

Und nehmen Sie nur das Element, das ich will, so funktioniert es für mich.