1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

NullPointerException bei ArrayAdapter

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von nithdi, 29.04.2010.

  1. nithdi, 29.04.2010 #1
    nithdi

    nithdi Threadstarter Neuer Benutzer

    Beiträge:
    19
    Erhaltene Danke:
    0
    Registriert seit:
    26.04.2010
    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!!
     
  2. Mort, 29.04.2010 #2
    Mort

    Mort Android-Lexikon

    Beiträge:
    960
    Erhaltene Danke:
    262
    Registriert seit:
    16.11.2009
    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: 29.04.2010
  3. swordi, 29.04.2010 #3
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    aufpassen mit getApplicationContext()

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

    nimm lieber MeineActivity.this
     
  4. nithdi, 29.04.2010 #4
    nithdi

    nithdi Threadstarter Neuer Benutzer

    Beiträge:
    19
    Erhaltene Danke:
    0
    Registriert seit:
    26.04.2010
    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.
     
  5. nithdi, 29.04.2010 #5
    nithdi

    nithdi Threadstarter Neuer Benutzer

    Beiträge:
    19
    Erhaltene Danke:
    0
    Registriert seit:
    26.04.2010
    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: 29.04.2010
  6. swordi, 29.04.2010 #6
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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
     
  7. Mort, 29.04.2010 #7
    Mort

    Mort Android-Lexikon

    Beiträge:
    960
    Erhaltene Danke:
    262
    Registriert seit:
    16.11.2009
    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...)
     
  8. nithdi, 29.04.2010 #8
    nithdi

    nithdi Threadstarter Neuer Benutzer

    Beiträge:
    19
    Erhaltene Danke:
    0
    Registriert seit:
    26.04.2010
    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.
     

Diese Seite empfehlen