Anfängerproblem: Abfragen welches Element eines Array auf Postion XY ist

P

pyretta

Ambitioniertes Mitglied
1
Hallo,

ich bin mir sicher das ist Javagrundlage und ein simples Anfängerproblem, aber ich komm einfach nicht drauf. Auch google hat mir nicht weiter geholfen.

Ich habe bisher folgendes codebeispiel bei Android Developers gefunden:
Code:
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(HelloGridView.this, "" + position, Toast.LENGTH_SHORT).show();
 }
 });
Das funktioniert zwar wunderbar, bringt mir aber leider nichts, da man hier nur die Position an sich abfrägt und zurück gibt.

Ich habe hier auch ein gridview das dynamisch mittels einer Arraylist (konvertiert zu einem Array) mit Bildern durch individuelle Auswahl des Users gefüllt wird. Zu jedem Bild gibt es eine gesonderte individuelle Information die durch ein "onItemClick" intiiert werden soll. Es handelt sich um ein Integer-Array mit höchstens 8 Elementen. Falls das wichtig ist.

Das Problem ist eben, dass an jeder Position jedes X-Beliebige Bild stehen kann, weshalb ich nicht einfach folgendes machen kann:

Code:
gridview.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
          if (arg2 == 0) { 
          dann mach irgendwas, das zum Bild passt.
          }
}}          
);

Ich habe es auch schon mit "indexOf(Object object)" versucht und das in die If-Abfrage wie folgt eingebaut:

Code:
... if(indexOf("elementname")==0){...} ...
Aber das klappt nicht, denn Eclipse denkt es handelt sich um eine Variable die natürlich nirgens deklariert ist.

Gleiches Spiel bei:
Code:
... if(ArrayName[0]=="elementname"){...} ...
Ich hoffe ihr könnt mir hier weiterhelfen.
Vielen Dank.

Liebe Grüße,
pyretta
 
Zuletzt bearbeitet:
Wenn du später nicht mehr rausfinden kannst welches Bild welche Position hat dann ist es erforderlich beim dynamischen Befüllen des Arrays das festzuhalten.
 
  • Danke
Reaktionen: pyretta
Hallo strider,

vielen Dank für deine Antwort.

Ist ein guter Hinweis, aber wie mach ich das denn? Ich glaub ich versteh nicht ganz wie du das meinst :blushing:
 
Bin mir nicht sicher, ob ich dein Problem richtig verstehe, aber wenn du mehr als nur das Bild in deinem grid haben willst, musst du einen eigenen Adapter bauen. Dieser enthält dann nicht eine Liste von Bildern (oder eine Liste von ResourceIDs wie in dem Beispiel) sondern stattdessen eine Liste von Objekten, die "das" Bild und "die" Zahlen kapseln.

Im getView des Adapters holst du dann das Bild heraus und im onClick kannst du über den Adapter dann auf die Zahlen zugreifen.

Die Beispiele bei den Listen mit "custom" ListItems sind da ein guter Einstieg. (jedenfalls ein besserer als das Beispiel beim GridView :D)
 
  • Danke
Reaktionen: pyretta
Hallo DieGoldeneMitte,

danke für deine Antwort.

Eigentlich würd ich gerne den einfachsten Weg gehn und nur die Bilder in den grid laden, wenn das denn geht.

Ich glaube ich habe mich auch zu kompliziert ausgedrückt im ersten Post.

Also...

  • Ich hab da ein Array mit insgesamt 12 Bildern die dem User angezeigt werden.
  • Davon kann er bis zu 8 Bilder auswählen (arrayList1.add.(element1)...) und dadurch die arrayList1 individuell befüllen.
  • Die arrayList1 überführe ich dann in eine zweite Activity und konvertiere sie dort zunächst in ein normales Array (z.B. array1).
  • Dieses array1 nutze ich in dem ImageAdapter in Verbindung mit dem gridView um die Bilder Tabellenförmig, quasi wie eine Gallery, anzeigen zu lassen.
Soviel zur Ausgangssituation die soweit auch funktioniert.




Jetzt zum Problem:

  • Das array1 hat ja wie gesagt 8 Positionen (0,1,2,3,4,5,6,7).
  • Auf jeder Position kann irgendein individuell gewähltes Bild der anfangs 12 vorgestellten Bilder stehn.
  • Jedes Bild soll einen zum Bild passenden individuellen Text anzeigen durch den "onItemClick"-Event.
Jetzt dachte ich, ich muss einfach nur eine If-Anweisung schreiben die zunächst erfragt

  • ob z.b. das Bild auf Position 0 geklickt wurde
  • und z.B. ob Bild1 auf Position 0 steht,
  • wenn dem so ist dann soll der Text zu Bild1 angezeigt werden.
Geht das denn nicht?

Ich meine, so ein Array weiss doch sicher welches Element auf der einzelnen Position steht, oder nicht?

Und diese "indexOf"-Methode sieht mir so aus, als könnte sie das erfragen. Oder lieg ich da falsch?

Dann könnte ich mir das mit dem ListView und custom ListItems doch sparen? :unsure:

Das wär mir echt lieber, wenn das ohne ginge...
 
Ganz blöde Frage: Du hast doch den Index, auf den geklickt wird und das Array bzw. die ArrayList, die die Bilder in dieser Reihenfolge enthält. Warum holst du das entsprechende Bild dann nicht einfach mit array[index] oder arraylist.get(index) wieder raus?
Du hast doch den Index und willst nur wissen, was für ein Bild an dieser Stelle liegt, oder?

Wobei so ein indexOf an und für sich auch nur eine kleine Fingerübung ist, die jeder selber implementieren können sollte.
Code:
public int indexOf(Object[] a, Object o) {
   for(int i = 0; i < a.length; i++) {
       if(a[i] == o) return i;
   }
   return -1;
}
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: pyretta
Oooooh Maaann!!!
Warum bin ich da nicht gleich drauf gekommen? Das ist ja sowas von... oooh maaaann... Ich denke zu kompliziert!

Also erstmal vielen Dank Kranki!! Und auch an alle anderen.

Das wars...
Habs so gelöst, und es funktioniert wunderbar:

Code:
gridview.setOnItemClickListener(new OnItemClickListener(){
               @Override
               public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                  if (arg2 == 0) { 
                      
                      Integer element = ArrayList1.get(0);

                     //Die Zahl "123456789" steht für den Integerwert des eingebundenen Bildes "R.drawable.bild1"
                      
                     if(element==123456789){
                     Context context = getApplicationContext();
                        CharSequence text = "Das ist Bild 1"; 
                         int duration = Toast.LENGTH_LONG;
                         Toast toast = Toast.makeText(context, text, duration);
                         toast.show();                         
                     }
                     if(element==987654321){
                          Context context = getApplicationContext();
                             CharSequence text = "Das ist Bild 2"; 
                              int duration = Toast.LENGTH_LONG;
                              Toast toast = Toast.makeText(context, text, duration);
                              toast.show();                         
                          }

                 }
                 if (arg2 == 1) { 
                     
                     Integer element = ArrayList1.get(1);

                      if(element==123456789){
                     Context context = getApplicationContext();
                        CharSequence text = "Das ist Bild 1"; 
                         int duration = Toast.LENGTH_LONG;
                         Toast toast = Toast.makeText(context, text, duration);
                         toast.show();                         
                     }
                     if(element==987654321){
                          Context context = getApplicationContext();
                             CharSequence text = "Das ist Bild 2"; 
                              int duration = Toast.LENGTH_LONG;
                              Toast toast = Toast.makeText(context, text, duration);
                              toast.show();                         
                          }

                 }
 
Zuletzt bearbeitet:
pyretta schrieb:
Oooooh Maaann!!!
Warum bin ich da nicht gleich drauf gekommen? Das ist ja sowas von... oooh maaaann... Ich denke zu kompliziert!

Also erstmal vielen Dank Kranki!! Und auch an alle anderen.

Das wars...
Habs so gelöst, und es funktioniert wunderbar:

Ich würde dringend dazu raten, nicht auf konkrete generierte int-Werte zu vergleichen, sondern die Konstanten in R.drawable zu referenzieren.
Außerdem hast du viel zu viel Copy&Paste in deinem Code. Die äußersten if erscheinen zumindest in diesem Auszug komplett sinnlos zu sein und sollten daher weggelassen werden.
Der Code in den inneren Verzweigungen ist bis auf den Wert von text auch komplett identisch, daher sollte alles bis auf die Zuweisung von text auch rausgezogen werden. Da der genaue Text von einem von einem Dutzend bekannter int-Werte abhängt würde sich da aus Gründen der Lesbarkeit ein switch anbieten.

Verbesserungsvorschlag:
Code:
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        
            Integer element = ArrayList1.get(arg2);
            CharSequence text;
            switch(element) {
                case R.drawable.bild1: text = "Das ist Bild 1"; break;
                case R.drawable.bild2: text = "Das ist Bild 2"; break;
                default: text = "Kein Text gefunden!"; break;
            }
            int duration = Toast.LENGTH_LONG;
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
    }
 
  • Danke
Reaktionen: pyretta
wow danke sehr! :ohmy:

Eigentlich sollte das nur ein Beispiel mit den Toasts sein, um zu testen ob es funktioniert. Aber so ist es natürlich viel besser und kann ich auch sehr gut verwenden. Bin eben immer noch recht am Anfang, aber ich lerne gerne weiter etwas dazu.

Der Hinweis mit den direkten Konstanten hilft mir auch sehr weiter.

Mich hat eben irritiert, dass mit System.out.PrintIn nur Integerwerte ausgegeben werden, was mir logisch vorkam da ich eine "ArrayList<Integer>" verwendet habe. Daher dachte ich, es ist fürs System einfacher diese Werte zu verwenden.

Nochmal vielen, vielen Dank! Wenn ich könnte würde ich für den Post min. 10 "Danke" hinterlegen.
 
pyretta schrieb:
Daher dachte ich, es ist fürs System einfacher diese Werte zu verwenden.

Um mal die Überlegung dahinter zu veranschaulichen: Dem System ist das in dem Fall eigentlich egal, was du da machst. Wenn du da direkt die int-Werte einträgst, gibt das nur zwei Probleme:
1. (Wichtig bei solchen generierten Werten: ) Weißt du, wie diese int-Werte zustandekommen? Ich auch nicht. Werden die sich ändern, wenn du Bilder entfernst, ersetzt oder hinzufügst? Gut möglich. Was sich aber auf keinen Fall ändert sind die Bezeichner in R.drawable.
2. (Allgemein wichtig bei derartigen Konstanten: ) Wenn du den Code in zwei Monaten nochmal in die Hand nimmst und siehst R.drawable.bild1, dann denkst du dir "Aha, der Fall ist Klick auf Bild1." Wenn du 987654321 siehst, dann denkst du dir "WTF?". Lesbarkeit ist wichtig.
 
  • Danke
Reaktionen: pyretta
Nochmal vielen Dank!
Du hast vollkommen Recht, es ist ja auch viel einfacher in der generellen Handhabung.

Wie oben irgendwo schonmal erwähnt :D ich denke einfach viel zu kompliziert.
 

Ähnliche Themen

R
Antworten
6
Aufrufe
982
swa00
swa00
B
Antworten
3
Aufrufe
1.286
swa00
swa00
Zurück
Oben Unten