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

Drawing Cache buggy?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von DieGoldeneMitte, 05.10.2010.

  1. DieGoldeneMitte, 05.10.2010 #1
    DieGoldeneMitte

    DieGoldeneMitte Threadstarter Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Hallo,

    ich versuche gerade, die Listen aus der "Music" Applikation (die, in denen man die Items verschieben kann) für meine Applikation zu adaptieren. Dabei bin ich auf foglendes Problem gestoßen:

    Nach einigem Scrollen und Verschieben wird als sich verschiebender Eintrag der Falsche angezeigt. Es kann passieren, dass man bei mehrfachem Auswählen hintereinander sogar unterscheidliche falsche Einträge gezeigt werden (ohne das zwischendurch etwas verschoben oder gescrollt wurde). Wenn man dann verschiebt, wird aber der richtige Verschoben - es ist also nur die Anzeige falsch.

    Das Malen dieses Eintrags erfolgt so, dass man in dem vom Adapter erzeugten View setDrawingCacheEnabled aufruft und dann das Bild anfordert. Der richtige Eintrag wird eigentlich ausgewählt - das habe ich geprüft, der View hat im debug() unten auch die richtigen Daten. Aber es kommt trotzdem die falsche Bitmap zurück.

    Kann es sein, dass Android sich bei den Caches verzettelt? Hat jemand so ein Verhalten auch schonmal beobachtet? Habe ich da irgendwo eine Nebenläufgikeit übersehen?

    Hier ein die wesentlichen Codeausschnitte:

    Aus dem Adapter
    Code:
            public void debug( int idx ) {
                Log.d("oite","#="+idx+" => "+data.get(idx).title);
            }
    
            public View getView(int pos, View v, ViewGroup parent) {
                DataRef holder = null;
                Log.d("main","pos="+pos+",v="+(v==null?"null":v.toString()));
                if( v==null ) {
                    v = inflator.inflate( R.layout.main_item, null );
                    holder = new DataRef();
                    holder.title = (TextView)v.findViewById(R.id.title);
                    v.setTag( holder );
                    v.setDrawingCacheEnabled(true);
                } else {
                    holder = (DataRef)v.getTag();
                }
                TodoList e = data.get(pos);
                holder.title.setText( e.title );
                return v;
            }
    
            private class DataRef {
                TextView title;
            } // class DataHolder
    
    Aus TouchInterceptor.onInterceptTouchEvent
    Code:
    ((MyAdapter)getAdapter()).debug(itemnum);
    Bitmap bitmap = Bitmap.createBitmap(item.getDrawingCache());
    startDragging(bitmap, y);
     
  2. DieGoldeneMitte, 06.10.2010 #2
    DieGoldeneMitte

    DieGoldeneMitte Threadstarter Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    ADD: Ich will noch anmerken, dass das Problem NICHT auftaucht, wenn ich in Adapter.getView die Views nicht recycle, sondern jedesmal neue Views erzeuge. Man merkt aber im Emulator den untschied in der Laufzeit.

    SOLVED(?): jetzt habe ich nach dem Malen den drawingCache wieder abgeschaltet. Seitdem ist der Fehler nicht mehr aufgetreten. ;-)
     
    Zuletzt bearbeitet: 06.10.2010
  3. dereulenspiegel, 07.10.2010 #3
    dereulenspiegel

    dereulenspiegel Android-Hilfe.de Mitglied

    Beiträge:
    105
    Erhaltene Danke:
    4
    Registriert seit:
    16.08.2009
    Ein ähnliches Problem hatte ich auch mal. Generell sollte man die Views schon recyclen, da gerade auf schwächeren Geräten das recyclen einiges bringt.
    Mein Problem war, dass ich meinen ListItems manchmal Bilder hatte und manchmal nicht. Nun kam es vor, dass bei Items die keine hatten manchmal irgendwelche Bilder angezeigt wurden. Was geholfen hat, ist alle "Felder" der recycleten View einmal zu nullen, also alles leer zu machen und erst dann wieder mit Daten zu füllen. Funktioniert bei mir jedenfalls mit API Level 3-8 ohne Probleme.
     

Diese Seite empfehlen