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

[Problem:] Eigenarten der GridView

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Unicate, 19.04.2011.

  1. Unicate, 19.04.2011 #1
    Unicate

    Unicate Threadstarter Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Hallo alle zusammen!

    Ich habe ein sehr eigenartiges Problem. Ich lade eine GridView mit allen Bildern auf dem Telefon. Die einzelnen Images sind an und abwählbar. Ich lade die Bilder in einem AsyncTask zurecht und schiebe sie dann auf die GridView sobald eine Thumbnail fertig geladen ist. Wenn alle Bilder geladen sind, ist das an und abwählen kein Problem. Wenn ich aber gerade noch die Bilder lade und ein Bild anklicke dann passiert es öfter (nicht immer, aber ca 50% meiner Klickversuche), das dieses Bild nicht selektiert wird. Stattdessen wird das erste Bild in der Reihe (GridView mit Reihen und Spalten) als Touched markiert wird (Mit Gelb-Orange farbenem Hintergrund, solange der Finger auf dem Bild ist) die Selektion des Bildes bleibt aber unverändert, was natürlich völlig neben der Funktionalität ist. Beim 3-4ten mal klicken (oder wenn die Bilder fertig geladen sind) geht es dann.

    Was ist das und wie kann ich dieses Problem beheben?
     
  2. DieGoldeneMitte, 19.04.2011 #2
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Wenn die UI sich "komisch" verhält, liegt es fast immer daran, dass man die UI aus dem falschen Thread heraus anspricht. Im Zweifel musst du ein paar Handler.post(Runnable) bei den Updates einbauen.

    Ansonsten musst Du warten, bis meine Kristallkugel und deine Codeschnipsel aus der Reinigung zurückkommen. :D
     
  3. Unicate, 19.04.2011 #3
    Unicate

    Unicate Threadstarter Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Hat sich schon erledigt.

    Problem ist folgendes gewesen:
    notifyDataChanges() braucht einfach zu lange. Da ich nach dem hinzufügen eines Bildes immer wieder notifyDataChanges() aufgerufen habe, hat dieser ständig die UI aktualisiert. In der Zeit der Aktualisierung sind klicks schwer registrierbar.

    Lösung:

    • Die UI nur "notifien" wenn es notwendig ist
      • Immer wenn der User an einer Position ist, welche ein notify erfordert (z.B. wenn der User schon nach unten gescrollt hat und die die Bilder noch laden)
    Dies ist die Methode zum hinzufügen einer Thumbnail in meinem Adapter wobei PRELOAD_IMAGE_COUNT die Anzahl der Images ist, welche noch notified werden sollen, obwohl sie gar nicht mehr angezeigt werden. (Das braucht man nur, wenn die Größe der Liste von ImageViews zur Laufzeit verändert wird)
    PHP:
        /**
         * Adds a new {@link Thumbnail} to the {@link GridView}
         * @param thumbnail {@link Thumbnail} you want to add
         */
        
    public void addThumbnail(Thumbnail thumbnail) {
            
    _thumbnails.add(thumbnail);
            if(
    _thumbnails.size()==|| _thumbnails.size()<=_maxSeenPosition+PRELOAD_IMAGE_COUNT){
                
    notifyDataSetChanged();
                
    _notifyPosition _thumbnails.size()-1;
            }
        }
    Dies ist ein Ausschnitt meiner getView() methode, nachdem ich die View erstellt/wiederverwendet habe
    PHP:
            // If the user reaches a position which is further
            // away then his last used positions
            
    if(position _maxSeenPosition)
                
    _maxSeenPosition position;
            
    // notify if nessessary
            
    if(position+PRELOAD_IMAGE_COUNT _notifyPosition && _notifyPosition<_thumbnails.size()-1) {
                
    notifyAsynchron();            
                
    _notifyPosition _thumbnails.size()-1;
            }
    Und das hier ist die Methode und der Handler zum asynchronen notifien:

    PHP:
        private void notifyAsynchron() {
            
    Message msg = new Message();
            
    msg.setTarget(notifyHandler);
            
    msg.sendToTarget();
        }
        
        private 
    Handler notifyHandler = new Handler() 
        { 
            @
    Override public void handleMessage(Message msg
            { 
                
    notifyDataSetChanged();
            }
        };
    Ich hoffe ich kann noch jemandem helfen damit.
     
    Zuletzt bearbeitet: 19.04.2011
    DieGoldeneMitte bedankt sich.
  4. DieGoldeneMitte, 20.04.2011 #4
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    So habe ich einen Handler noch nie gesehen.

    Like it. :thumbsup:
     

Diese Seite empfehlen