Listview Wert auslesen ohne Item anklicken

@Reallord:
Du hast ja auch schon alle Iteminhalte in deiner Liste, die am Adapter "klebt". Soweit ich das aber verstanden
habe, geht es ja um die Eingabe eines NEUEN Textes, der eben noch gar nicht in der Liste ist, sondern
ausgelesen werden soll und der in einem Item im Listview-item steht.

@Ronny:
versuche es doch erstmal mit der setOnFocusChangeListener-Methode,
damit solltest du immer "sofort" den Wert bekommen, wenn ein Edittext den Focus verliert.
(wenn du die Listview oder deren container "focusable" machst, sollte das
Focus verlieren auch beim scrollen der Fall sein)
 
Ich dachte eigentlich schon, ich hätte das richtig verstanden.

Also, ich hab meine Beispiel App gestartet. Sichtbar sind ~11 Items.
Ich scrolle zu Eintrag 100, ändere den Text, scrolle wieder zum Anfang.
Und drücke schließlich meinen Button, der mir den Inhalt vom geänderten, nicht sichtbaren Item 100 geben soll.
Sieht dann so aus:
Screenshot_2015-04-02-22-04-38.png

Damit aber insbesondere der neu eingegebene Text auch später wieder ausgelesen werden kann, hab ich bei der Initialisierung der EditTexts einen TextWatcher angehängt, der die Daten speichert. (Das hab ich vorher bisher nicht erwähnt, da ronny ja das Problem hat, überhaupt nicht an die Items ranzukommen.)
 
ah, ok mit Textwatcher erklärt natürlich einiges ;)
der springt aber bei jedem Tastendruck an, oder ?
das setOnFocusChangeListener würde halt nur einmal anspringen.
jedenfalls wird er wohl entweder Textwatcher oder Focuslistener
nutzen müssen, um die Daten zu speichern
 
Öhmm, japp, TextWatcher springt für jeden Tastendruck an. Ist mir aber egal. :flapper:
 
hehe ... ich wollte es auch nur wissen, da ich damit noch nicht gearbeitet habe ;)
 
reallord schrieb:
Möglich, dass ich das nicht richtig hervorgehoben hab.

Bei einer ListView von x Einträgen (Zum Spass 100000), sind bei mir ~13 Items sichtbar, ich komme aber zu jeder Zeit mittels
Code:
listview.getAdapter().getItem(position)
an die Daten vom jeweiligen Eintrag.
Dabei spielt es keine Rolle, ob der Eintrag sichtbar ist oder eben nicht.

Es ist aber durchaus möglich, dass das nur wegen dem CustomAdapter / Item Klasse aus dem Beispiel, dass ich verwendet habe, geht. --> Siehe Edit

Zusatz:
Wenn man sich meinen Adapter im Debug ansieht, dann sieht man auch sehr schön, dass alle! Items in einer ArrayList gespeichert sind.

Es ist sicherlich richtig und sinnvoll, dass Android nur für die sichtbaren Items einer ListView - ich nenn das mal - 'Draw'-Speicher belegt. Aber Inhalt und Position der nicht sichtbaren Items müssen natürlich trotzdem im Speicher liegen, auch wenn sie dann natürlich keinen 'Draw'-Speicher brauchen.

Edit:
So, ich hab mir grad noch mal den von mir verwendeten Beispielcode angesehen und komme zu dem Schluß, dass es eben tatsächlich an dem CustomAdapter liegt. Dort wird die Variable itemsArrayList angelegt und darin sind dann die Items gespeichert.
Und darauf kann ich dann halt später auch jeder Zeit zugreifen.
Sprich: Du brauchst auch so eine Liste in der Du dir deine Items zwischenspeicherst. Wie hoch da der Aufwand ist, um deine Implementierung anzupassen, kann ich aber nicht abschätzen.

Könntest du mir ggf. mal deinen CustomAdapter posten?
 
@reallord

Mit getItem() würde ich nur arbeiten, du keine komplexeren Views im Listview benutzt.

Man kann die Views auch einfach mappen. Die einfachste Möglichkeit wäre es, im Adapter den EditText Views einen Tag mit zu geben (die Methode View getView() überschreiben. Adapter | Android Developers). Den Tag hängt man an den EditText mit der Methode setTag(). View | Android Developers

Nachdem der Adapter dem ListView übergeben wurde, bekommt man an den Inhalt aller Edittext mit einer einfachen Schleife.
Dafür braucht man nur den ListView und die Methode findViewWithTag(). View | Android Developers

Der Vorteil dieser Vorgehensweise ist, dass man ListViews mit komplexeren Strukturen schnell durchsuchen kann.

Und man braucht keine TextWachter (TextWatcher | Android Developers), sondern kann einfacher beim Beenden der Activity/Fragment alle Views auf einen Rutsch auslesen.

Theoretisch geht das auch mit setId und findViewById. Die Id muss nur kleiner als 0x00FFFFFF, sonst landest du in den Bereich, der vom System vergeben wird.

android - How can I assign an ID to a view programmatically? - Stack Overflow
 
  • Danke
Reaktionen: ronny130286
ronny130286 schrieb:
Könntest du mir ggf. mal deinen CustomAdapter posten?

Ja, klar, kein Problem. Wie in einem der vorherigen Post erwähnt, hab ich als Beispiel/Grundlage das hier genommen.
Dazu kam dann halt der Textwatcher, der an genau der Stelle liegt, die markus.tullius (getView überschreiben) auch meint. Dort müsste eben sonst das setTag() hin.
Es ist aber eben ein Beispiel mit eigener XML Struktur, inwieweit Du deine Implementierung anpassen kannst/musst, weiß ich nicht. (Egal, ob Du nun einen FocusListener, setTag oder einen Textwatcher benutzt.)

PHP:
import java.util.ArrayList;

import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class MyAdapter extends ArrayAdapter<Item> {

    private final Context context;
    public ArrayList<Item> itemsArrayList;
    

    public MyAdapter(Context context, ArrayList<Item> itemsArrayList) {

        super(context, R.layout.row, itemsArrayList);

        this.context = context;
        this.itemsArrayList = itemsArrayList;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        // 1. Create inflater
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        // 2. Get rowView from inflater
        View rowView = inflater.inflate(R.layout.row, parent, false);

        // 3. Get the two text view from the rowView
        TextView labelView = (TextView) rowView.findViewById(R.id.label);
        TextView valueView = (TextView) rowView.findViewById(R.id.value);

        // 4. Set the text for textView
        labelView.setText(itemsArrayList.get(position).getTitle());
        valueView.setText(itemsArrayList.get(position).getDescription());
        
        // add textwatcher
        valueView.addTextChangedListener(new TextWatcher()
        {
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
            {

            }

            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
            {
            }

            public void afterTextChanged(Editable editable)
            {
                // save changed text
                getItem(position).setDescription(editable.toString());
            }
        });


        // 5. retrn rowView
        return rowView;
    }
}
@markus.tullius
Man könnte wohl auch setTag() verwenden. Einen wesentlichen Vorteil seh ich allerdings nicht. Mit getItem() kann ich direkt auf ein spezifisches Item zugreifen. Mit getPosition() genau anders rum, wenn ich die Position zu einem Item suche. Und da ich alle Items in einer ArrayList habe, kann ich darüber auch easy mit einer Schleife alles machen, was ich will.
 
  • Danke
Reaktionen: ronny130286
reallord schrieb:
Ja, klar, kein Problem. Wie in einem der vorherigen Post erwähnt, hab ich als Beispiel/Grundlage das hier genommen.
Dazu kam dann halt der Textwatcher, der an genau der Stelle liegt, die markus.tullius (getView überschreiben) auch meint. Dort müsste eben sonst das setTag() hin.
Es ist aber eben ein Beispiel mit eigener XML Struktur, inwieweit Du deine Implementierung anpassen kannst/musst, weiß ich nicht. (Egal, ob Du nun einen FocusListener, setTag oder einen Textwatcher benutzt.)

PHP:
import java.util.ArrayList;

import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class MyAdapter extends ArrayAdapter<Item> {

    private final Context context;
    public ArrayList<Item> itemsArrayList;
    

    public MyAdapter(Context context, ArrayList<Item> itemsArrayList) {

        super(context, R.layout.row, itemsArrayList);

        this.context = context;
        this.itemsArrayList = itemsArrayList;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        // 1. Create inflater
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        // 2. Get rowView from inflater
        View rowView = inflater.inflate(R.layout.row, parent, false);

        // 3. Get the two text view from the rowView
        TextView labelView = (TextView) rowView.findViewById(R.id.label);
        TextView valueView = (TextView) rowView.findViewById(R.id.value);

        // 4. Set the text for textView
        labelView.setText(itemsArrayList.get(position).getTitle());
        valueView.setText(itemsArrayList.get(position).getDescription());
        
        // add textwatcher
        valueView.addTextChangedListener(new TextWatcher()
        {
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
            {

            }

            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
            {
            }

            public void afterTextChanged(Editable editable)
            {
                // save changed text
                getItem(position).setDescription(editable.toString());
            }
        });


        // 5. retrn rowView
        return rowView;
    }
}
@markus.tullius
Man könnte wohl auch setTag() verwenden. Einen wesentlichen Vorteil seh ich allerdings nicht. Mit getItem() kann ich direkt auf ein spezifisches Item zugreifen. Mit getPosition() genau anders rum, wenn ich die Position zu einem Item suche. Und da ich alle Items in einer ArrayList habe, kann ich darüber auch easy mit einer Schleife alles machen, was ich will.

Ich habe es jetzt auch mal für meinen Adapter angepasst zumindest erstmal mit einem EditText und das sieht erstmal ganz gut aus, bekomme ich alle EditText Einträge angezeigt ;)

Werde mir jetzt mal den Adapter für das komplette Item fertig machen und mal sehen ob es dann auch alles funktioniert ;)

EDIT:

Könnte man sich eigentlich auch den TextWatcher implementieren und dann nur mittels "valueView.addTextChangedListener(this)" aufrufen oder weis er dann seine position vom Item nicht? Geht mir nur darum das man sich damit viele Codezeile spart und ein übersichtlicher bleibt ;)
 
Zuletzt bearbeitet:

Ähnliche Themen

R
  • RalfKahl
Antworten
10
Aufrufe
324
RalfKahl
R
H
Antworten
2
Aufrufe
1.316
Hcman
H
5
Antworten
22
Aufrufe
1.441
590239
5
Zurück
Oben Unten