Drawing Cache buggy?

DieGoldeneMitte

DieGoldeneMitte

Dauergast
262
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);
 
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:
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.
 

Ähnliche Themen

T
Antworten
1
Aufrufe
947
tefracky
T
T
Antworten
12
Aufrufe
1.413
tefracky
T
S
  • Smokehead
Antworten
0
Aufrufe
930
Smokehead
S
Zurück
Oben Unten