Frage Android: EditText im ListView-Problem


Ich habe eine Listenansicht in meiner Anwendung, die im Grunde ein Fragebogen ist, also gibt es einige Edittexte, die der Benutzer ausfüllen muss. Ich habe folgende Probleme festgestellt:

  1. Einige der EditText erfordern numerische Eingaben, daher setze ich den inputType im entsprechenden xml-Typ als numerisch, aber wenn ich auf EditText klicke, wird die numerische Tastatur angezeigt, aber fast sofort verschwindet sie 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 den Fokus zu verlieren, aber ich löste es mit anderen Fragen (added decendantFocusablity = "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-Methode für Listenadapter:

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

9
2018-06-30 00:17


Ursprung


Antworten:


Lösungen für die Ausgabe # 3:

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

  2. einstellen windowSoftInputMode="adjustPan" im Manifest

  3. einstellen listview.setItemsCanFocus(true)


18
2018-04-24 15:11



Um weiter zu expandieren aaBiyecH's Antwort über, hier ist eine Lösung und eine ausführlichere Erklärung für Ihre Fragen # 1 und # 3 (Quelle):

Sie müssen das einstellen DeszendentFokussierbarkeit Eigenschaft Ihrer ListView zu "afterDescendants".

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

android:descendantFocusability="afterDescendants"

oder im Code wie folgt:

listview.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS)

Sie müssen auch festlegen, dass die Objekte fokussierbar sein sollen.

Sie können dies in dem Code folgendermaßen tun: listview.setItemsCanFocus(true);

Außerdem müssen Sie angeben, was mit dem Hauptfenster Ihrer Aktivität passiert, wenn die Soft-Tastatur angezeigt wird. Dies geschieht durch Ändern der WindowSoftInputMode Attribut. 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 mit dem Attribut tun android:windowSoftInputMode="adjustPan" in der XML Ihrer Hauptaktivitätsklasse oder getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_PAN) programmatisch.


4
2018-01-06 03:18



Aufgrund von Frage 2 können Sie sich auf diesen Beitrag beziehen EditText-Elemente in einer Bildlaufliste verlieren ihre Änderungen, wenn sie vom Bildschirm gescrollt werden Es scheint also keine einfache Lösung zu sein, die Edittexte beim Scrollen zu erhalten

Ja, dein Recht, du kannst es versuchen

EditText verliert Inhalt beim Blättern in ListView

oder beziehen Sie sich einfach auf die verwandten Beiträge auf der rechten Seite


0
2018-06-30 00:30



Es funktioniert für mich .... Bitte überprüfen Sie dies

listview.setItemsCanFocus(true);

0
2018-04-03 07:59



Ich habe eine Listview mit Edittext und wenn ich Text darin eingeben, wenn ich vorher die Listenansicht scrolle, nimmt der Adapter einige Positionen, nicht die ausgewählten.

Mein Adapter nimmt verschiedene Positionen an statt meiner Auswahl:

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

Eine Editiertext 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 dem onTouchListener hinzugefügt, um nur die Auswahlposition zu erhalten:

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 nimm nur den Gegenstand, den ich will, es funktioniert für mich.


0
2017-09-25 09:30