NullPointerException bei ArrayAdapter

N

nithdi

Neues Mitglied
0
Hi Leute,

ich habe ein Problem mit Android, bei dem ich absolut nicht weiter komme.
Also hoffe ich hier auf eure Hilfe :)

Zum Problem:

Ich habe eine Tabactivity mit insgesamt 3 Tabs: | Artists | Albums | Songs |

Gestartet wird im Artists Tab, wo ich ein ListView mit allen möglichen Artists habe (wird aus einer SQL Datenbank geholt). Wenn man nun auf ein ListItem klickt, soll das Programm zum Albums Tab wechseln und alle Alben des zuvor angeklickten Interpreten anzeigen.
Das wollte ich folgendermaßen lösen:
Ich überschreibe die OnItemClick Methode von der Astists-ListView und führe dort dann einfach wieder eine SQL Abfrage durch, lade die Ergebnisse in einen ArrayAdapter und binde diesen an die Album-ListView.

Code des ArrayAdapters aus Artists-Listview:
Code:
cu.moveToFirst();
            if (cu != null) {
              if(cu.isFirst()) {
                  artists = new String[cu.getCount()];
                   for(int i = 0; i < cu.getCount() - 1; i++) {
                     artists[i] = cu.getString(ArtistsColumn);
                       if (cu.isLast() == false) {
                         cu.moveToNext();
                       }
                   }
                
              }
            } 
            ArrayAdapter<String> aa = new ArrayAdapter<String>(getApplicationContext(),
                    R.xml.simple_list_item_1,
                    artists);
                    artistslist.setAdapter(aa);
Code der überschriebenen ItemClickMethode:
Code:
artistslist.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

...

int AlbumColumn = cu2.getColumnIndex("Album");
                        
                        cu2.moveToFirst();
                        if (cu2 != null) {
                          if(cu2.isFirst()) {
                              albums = new String[cu2.getCount()];
                                for(int i = 0; i < cu2.getCount() - 1; i++) {
                                 albums[i] = cu2.getString(AlbumColumn);
                                   if (cu2.isLast() == false) {
                                     cu2.moveToNext();
                                   }
                               }
                            
                          }        
                        } 
                        
                    
                     
                      ArrayAdapter<String> aa2 = new ArrayAdapter<String>(getApplicationContext(),
                                    R.xml.simple_list_item_1,
                                    albums);
                      albumlist.setAdapter(aa2);
Allerdings klappt das nicht. In der Artistsliste klappt alles, kann auch auf ein Item klicken, danach kommt aber ne NullPointerException.

Mein Verdacht ist das getApplicationContext des zweiten Arrayadapters. Denn sobald ich den Adapter nicht setze, kann ich in Tab 2 springen.

Hoffentlich habt ihr ne Idee.. bin schon echt am Verzweifeln.

DANKE!!
 
getApplicationContext liefert eigentlich immer was. In welcher Zeile kommt denn die Exception (logcat)?

Kleiner Tipp nebenher: Wenn du dasselbe Layout verwendest (hier simple_list_item_1) kannst du auch den ArrayAdapter wie eine Liste verwenden, also aa.clear(), aa.add( album ), usw.

Ach ja: Kommst du denn sicher an die Stelle, an der das albums-Array angelegt wird? Wenn keine Datensätze geliefert werden, gibt's nämlich ein Problem... Vielleicht sicherheitshalber vorher mit albums = new String[0] initialisieren...
 
Zuletzt bearbeitet:
aufpassen mit getApplicationContext()

das kann serwohl null liefern, da es einen bug da im sdk gibt

nimm lieber MeineActivity.this
 
Funktioniert leider auch nach Aktualisierung nicht.

Das Array wird jetzt sauber initialisiert und hab den Arrayadapter so umgeändert:

Code:
ArrayAdapter<String> aa2 = new ArrayAdapter<String>(MediaLibrary.this,
                                    R.xml.simple_list_item_1,
                                    albums);
                      albumlist.setAdapter(aa2);
Mir wird aber leider immernoch ne Exception vor die Füße geworfen:
Code:
04-29 13:12:21.309: WARN/dalvikvm(725): threadid=3: thread exiting with  uncaught exception (group=0x4000fe70)

04-29 13:12:21.309: ERROR/AndroidRuntime(725): Uncaught handler: thread  main exiting due to uncaught exception

04-29 13:12:21.369: ERROR/AndroidRuntime(725):  java.lang.NullPointerException


Die MediaLibrary ist eine TabActivity, falls das eine Rolle spielt.
 
Ok hab den Fehler!


Liegt an nem verdammten "-1":

for(int i = 0; i < cu2.getCount() - 1; i++) {

muss heißen

for(int i = 0; i < cu2.getCount(); i++) {
 
Zuletzt bearbeitet:
gut wenns geht

noch ein kleiner tipp
mach lieber zuerst
int x = cu2.getCount();

und dann mit x in die for schleifen, ist ein wenig besser für die performance
 
OK, ich hatte mehr daran gedacht, dass vielleicht der Array selbst null sein könnte. Ans letzte Element hab ich nicht gedacht...

Ich hätte einfach
Code:
aa.clear();
if (cu2 != null) {
  while (cu2.moveToNext()) {
    aa.add(cu2.getString(AlbumColumn));
  }
}
gemacht und das Problem so galant umgangen... ;) Hätte nebenbei noch den Vorteil, dass Android in dem Fall die Element-View nicht neu parsen muss, was v.a. bei komplexeren Listen schon was ausmachen kann.
(Und dann gibt's ja auch noch spezielle Adapter für Cursors. Mit denen hab ich mich aber auch noch nicht näher beschäftigt...)
 
Sind denn die Cursoradapter viel schneller?

Da je nach größe einer Musikdatenbank schonmal 5000 Interpreten drin stehen können, wärs natürlich von Vorteil, wenn man noch an der performanceschraube drehen kann.
 

Ähnliche Themen

D
Antworten
17
Aufrufe
408
datNeMo
D
M
Antworten
3
Aufrufe
168
moin
M
Y
Antworten
4
Aufrufe
1.227
swa00
swa00
Zurück
Oben Unten