[Problem:] Eigenarten der GridView

U

Unicate

Erfahrenes Mitglied
57
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?
 
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
 
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()==1 || _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:
  • Danke
Reaktionen: DieGoldeneMitte
So habe ich einen Handler noch nie gesehen.

Like it. :thumbsup:
 

Ähnliche Themen

M
Antworten
3
Aufrufe
161
moin
M
W
  • WuDiDong
Antworten
3
Aufrufe
767
jogimuc
J
M
Antworten
2
Aufrufe
628
Mozart40
M
Zurück
Oben Unten