Listview Wert auslesen ohne Item anklicken

ronny130286

ronny130286

Fortgeschrittenes Mitglied
24
Hallo

ich steh gerade auf dem Schlauch, ich habe eine Listview, im Item ist ein Edittextfeld enthalten (die Listview hat 5 Item).

Jetzt möchte ich über einen Button z.B genau das Edittextfeld aus Item1 ansprechen und mir den Text ausgeben, nur irgendwie bekomme ich den eingegeben wert nicht angezeigt.

hatte es so versucht nur leider geht das nicht
Code:
BtnTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
view = lv.getAdapter().getView(0,null,null);

EditText EdTxt = (EditText) view.findViewById(R.id.editTxt);

String testTxt = EdTxt.getText().toString();
                
Toast.makeText(getActivity().getApplicationContext(),"Test: " + testTxt ,Toast.LENGTH_SHORT).show();
}
});
 
was bitte soll das? hört sich redundant an....


"getActivity().getApplicationContext()"
 
ja okay man kann sicherlich auch "getActivity().getApplicationContext()" => "getActivity()" drauß machen, dass tut der Sache aber nichts ab das ich nicht einzeln auf die EditText eines bestimmten Items zugreifen kann.

Der Toast ist lediglich zum Testen gewesen ob ich überhaupt ein Wert erhalte ;)


Aber ich habe mir auch schon überlegt ob dies der richtige Weg ist.
Ich möchte im Gesamten eigentlich erreichen das ich mir über die Listview eine variable Eingabemaske aus einer Datenbank für eine Datenbank zusammen baue, d.h. die Maske von der Items ist immer gleich, aber die Beschriftung, die ich mir aus einer DB hole für die Labels ist komplett unterschiedlich und hat auch andere Bedeutungen.
 
Zuletzt bearbeitet:
Hallo, so richtig schlau werde ich aus deinem Code bzw. aus dem was du schreibst nicht...
An sich sieht dein Code aber richtig aus, jedenfalls fällt mir nichts auf die schnelle auf.

Bist du sicher, dass diese Zeile so korrekt ist?
view = lv.getAdapter().getView(0,null,null);

Tipp: Log.d("dein Tag", "deine Nachricht"); // <- eignet sich zum Testen auch ganz gut. ;)
 
Verstehe ich das richtig, das du also immer 5 Zeilen in der Listview hast,
je zeile immer ein Label, das du dynamisch mit Daten aus einer DB
betitelst und ein Edittext für Eingaben des Users ?

in der Art
Code:
DB-Labelbeschriftung1   Edittext1
DB-Labelbeschriftung2   Edittext2
DB-Labelbeschriftung3   Edittext3
DB-Labelbeschriftung4   Edittext4
DB-Labelbeschriftung5   Edittext5

wie wird das Layout gemacht, Xml oder per Source ?
 
DB-Labelbeschriftung1 Edittext1
DB-Labelbeschriftung2 Edittext2
DB-Labelbeschriftung3 Edittext3
DB-Labelbeschriftung4 Edittext4
DB-Labelbeschriftung5 Edittext5
Ja genau so muss man sich das vorstellen, das Item für die Liste habe ich als XML erstellt und das dann lade ich das über meinen Custom Listadapter.
 
Zuletzt bearbeitet:
hmm ..
ich denk mal, du solltest die Listview abfragen, nicht den Adapter.

View v = listview.getChildAt(0) < sollte dir das layout der ersten zeile geben
Edittext = (EditText) v.getChildAt(1) < sollte dir das Editfeld geben

Ich hab das jetzt nur aus dem kopf geschrieben, aber so ungefähr sollte es passen ?
 
  • Danke
Reaktionen: ronny130286
zumafx schrieb:
hmm ..
ich denk mal, du solltest die Listview abfragen, nicht den Adapter.

View v = listview.getChildAt(0) < sollte dir das layout der ersten zeile geben
Edittext = (EditText) v.getChildAt(1) < sollte dir das Editfeld geben

Ich hab das jetzt nur aus dem kopf geschrieben, aber so ungefähr sollte es passen ?

Gute Idee :)

habe es jetzt mal versucht und zwar so hier:
Code:
View view = lv.getChildAt(0);
edTxtTest = (EditText) view.findViewById(R.id.edTxt);

damit kann ich dann jeden Edittext einzeln ansprechen :)
 
Super, das du den Weg gefunden hast
dann mal viel spass beim weiter machen ;)
 
View view = lv.getChildAt(0);
edTxtTest = (EditText) view.findViewById(R.id.edTxt);

geht doch nicht sooooo gut, weil sobalb die Liste zum scrollen ist funktioniert das ganze nicht mehr.

Weis jemand auf Anhieb wie ich dennoch alle Item auslesen kann(über den Adapter eventuell)?
 
Zuletzt bearbeitet:
Das Problem bei der Listview ist, dass nur die Items wirklich existieren die er auch in der View hat (Zitat: wenn eine Listview 1000 Item hätte würde der Speicher überlaufen), auf die nicht sichtbaren kann man scheinbar nicht so einfach zugreifen, das sieht man auch wenn man mal den Log auf
listview.getChildCount() würde bei mir 4 ergeben

und listview.getAdapter().getCount() ergibt bei mir 5 => das ist auch der richtig Wert den ich haben möchte

Ich werde mir deinen Link wenn ich zu hause bin nochmal ansehen;)
 
Zuletzt bearbeitet:
hey ich wollte mal was einwerfen
verwertet android nciht ungenutzte Views die man nciht sieht um speicherolatz für neue views zu schaffen?
 
Jaiel schrieb:
hey ich wollte mal was einwerfen
verwertet android nciht ungenutzte Views die man nciht sieht um speicherolatz für neue views zu schaffen?

Ja das sollte so stimmen, selbst im Log hat man keinen Zugriff auf die nicht sichtbaren childs

was heißt denn "nicht soooo gut" ?
wenn du aus einer Zeile den Text auslesen kannst, solltest du das auch für alle weiteren zeilen können ?

Zeig doch mal deinen bisherigen Code

hab noch mal was gegoogelt, evtl. hilft dir das weiter ?

android - listview get item view by position - Stack Overflow

auch die im Link beschriebene Variante funktioniert nicht.
 
hmmm .. doof ;)
dann evtl. einen "onFocusChangeListener()" an's jeweilige EditText zuordnen,
um immer "sofort" den Edittext zu holen, wenn das Feld den Focus verliert

von Stackoverflow:
Code:
final EditText et = (EditText)findViewById(R.id.my_edit_text);
et.setOnFocusChangeListener(new View.OnFocusChangeListener()
{
    @Override
    public void onFocusChange(View v, boolean hasFocus) // v = dein Edittext
    {
        if (!hasFocus)
            // TODO: the editText has just been left
            // hier den Text holen und merken 
    }
});

Nachtrag:
Hab gerade überlegt, ob eine Listview überhaupt der bessere Weg für deine Problemstellung ist.
Du könntest dir ja auch selber eine scrollbare "Eingabemaske" bauen.
Mal eine Lösung, die in einer meiner App's prima funktioniert:

XML-Datei:
Scrollview, in der ein Linearlayout(vertical, id z.B. root) sitzt.

im source (oncreate) dann deine DB-Einträge lesen und in einer Schleife die Einträge durchlaufen:
Je Durchlauf dann:
Code:
Pseudocode:
Linearlayout (horizontal, Id = i) erstellen
Textview erstellen (id z.B. "tv"+String.ValueOf(i)) und Text setzen
Edittext erstellen (id wie bei Textview)
die beiden dann ins erstellte LinearLayout stecken
das Linearlayout in dein root.Layout adden

Beim Auslesen dann:
Code:
LinearLayout root = (LinearLayout) findViewById(deinRootLayout);
for (int i=0; i <= root.getChildCount()-1; i++) {
    LinearLayout zeile = (LinearLayout) findViewById(i);
    for (int j = 0; j <= zeile.getChildCount()-1; j++){
        View child = zeile.getChildAt(j);
        if(child instanceof EditText) {
            child.getId();
            child.getText....
            // Text und Id auslesen und die Werte dann merken (z.B. in einer Arraylist/ContentValues, etc, je nachdem was am besten zur Weiterverarbeitung passt.

Wie gesagt, bei mir funktioniert das prima und ich hab immer zugriff auf alle "Datenzeilen".
 
Zuletzt bearbeitet:
An dem Punkt war ich auch schon angekommen das Layout über den Code zusammen zu bauen, werde mir das heute Abend nochmal ansehen, schöner wäre es natürlich wenn man Code und Anzeige trennen kann.
 
ronny130286 schrieb:
Das Problem bei der Listview ist, dass nur die Items wirklich existieren die er auch in der View hat (Zitat: wenn eine Listview 1000 Item hätte würde der Speicher überlaufen), auf die nicht sichtbaren kann man scheinbar nicht so einfach zugreifen, das sieht man auch wenn man mal den Log auf
listview.getChildCount() würde bei mir 4 ergeben

und listview.getAdapter().getCount() ergibt bei mir 5 => das ist auch der richtig Wert den ich haben möchte

Ich werde mir deinen Link wenn ich zu hause bin nochmal ansehen;)

Ich hab grad mal nen bisschen gespielt und ne ListView mit 100000 (Japp, Hunderttausend) Items erstellt. Geht ohne Probleme.
Zugegeben, aus Faulheit hab ich nur bis ~3500 gescrollt, ich geh aber mal davon aus, dass auch der Rest da is.

Geht denn das hier nicht?
Code:
listView.getAdapter().getItem(99990);
Ich bin damit an den Inhalt von Item 99990 rangekommen. Als Beispiel hab ich das hier verwendet. Ich geb aber zu, dass ich generell ein Fokusproblem hab, sobald ich mehr als 7 Items hatte, das liegt aber glaub ich eher an dem Beispiel als an der ListView.
 
Ja, genau die Views, die Angezeigt werden. Also max 10 Items. Der Rest wird nicht erzeugt, sondern steht nur in einer Liste.

Der ursprüngliche Beitrag von 17:03 Uhr wurde um 17:05 Uhr ergänzt:

view.setTag und view.findViewByTag könnten eine Lösung für das Itemproblem sein.
 
Wie viele View letzten Endes angezeigt werden liegt ja auch daran wie das Layout von dem Item aussieht, ich hatte es bis jetzt nur mit einem EditText und mehreren Labels befüllt somit bekomme ich auf meinem S5 gerade mal 4 Item angezeigt (und die Controls sind noch nicht alle im Item).

Für das 5 Item müsste ich momentan schon scrollen und damit verliere ich die Daten aus dem ersten Item (Child), zumindest kann ich sie über einen Button der außerhalb der Listview ist nicht mehr erreichen.
 
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.
 

Anhänge

  • listviewdebug.png
    listviewdebug.png
    9,5 KB · Aufrufe: 213
Zuletzt bearbeitet:

Ähnliche Themen

R
  • RalfKahl
Antworten
10
Aufrufe
301
RalfKahl
R
H
Antworten
2
Aufrufe
1.311
Hcman
H
5
Antworten
22
Aufrufe
1.421
590239
5
Zurück
Oben Unten