Frage

verwende ich in der getView () - Methode von dieser Beispiel eine statische Funktion, um die Quelle eines Image zum Download bereit. Später wird es enthalten sein Threading. Allerdings Ich mag im Allgemeinen wissen, wie speichert die Verwendung statischer Funktion ist in diesem Fall.

Weil ich erfuhr, dass in einigen Fällen (wenn ich wirklich schnell bewegen) die Bilder vertauscht sein.

    /**
    * Is called, when the ListAdapter requests a new ListItem, when scrolling. Returns a listItem (row)
    */
        public View getView(int position, View convertView, ViewGroup parent) {
                        View v = convertView;
                        if (v == null) {
                            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                            v = vi.inflate(R.layout.row, null);
                        }
                        Order o = items.get(position);
                        if (o != null) {
                                TextView tt = (TextView) v.findViewById(R.id.toptext);

                                if (tt != null) {
                                      tt.setText("Name: "+o.getOrderName());                            }

//At this point I use a static function to download the bitmap to set it as source of an ImageView

                        }
                        return v;
                }
War es hilfreich?

Lösung

Ich reparierte dies nicht die Renderer Wiederverwendung (es klingt wirklich mehr schmerzhaft, als es ist), sondern „Caching“, um sie mit einem Array mit WeakReference Objekte. Das macht Ihre Liste schnell und verhindert, dass Sie Bilder auf Renderer Einstellung, die nun für andere Daten verwendet werden, während zur gleichen Zeit der GC eine Chance, die nicht verwendeten Listenelemente zu entfernen, wenn Sie wenig Speicher ausgeführt werden.

public View getView(int position, View convertView, ViewGroup parent) {
    Renderer result = null;
    WeakReference<Renderer> wr = (WeakReference<Renderer>) _renderers[position];
    if (ref != null)
        result = wr.get();

    if (result == null) {
        result = new Renderer(_context);
        // set the texts here and start loading your images
        _renderers[position] = new WeakReference<Renderer>(result);
    }
    return result;
}

Sie müssen Guss _renderers [Position], um WeakReference, weil Java nicht unterstützt Arrays mit Generika, so _renderers ist ein Array von Objekten

Andere Tipps

  

verwende ich in der getView () - Methode dieses Beispiels eine statische Funktion die Quelle eines Image zum Download bereit.

Ich habe keine statische Methode überall in dieser Blog-Post sehen.

  

Weil ich erfuhr, dass in einigen Fällen (wenn ich wirklich schnell bewegen) die Bilder vertauscht sein.

Das hat nichts mit der Methode statisch zu tun, und alles, was mit der Anwendung der Bilder zu tun. Reihen erhalten recycelt. Daher, wenn ein Download eines Bildes zu lange dauert, kann es sein, dass das Bild nicht mehr benötigt wird - die ImageView sollte stattdessen ein anderes Bild zeigen. Eine Möglichkeit, dies zu adressieren ist die URL des Bildes durch eine ImageView in setTag() auf dem ImageView selbst benötigt bleiben. Wenn der Download abgeschlossen ist, bevor das heruntergeladene Bild im ImageView, Call getTag() und vergleichen URLs setzen. Wenn die URL in dem Tag als die URL unterscheidet, die heruntergeladen wurde, nicht die ImageView aktualisieren, da diese für das falsche Bild sein wird.

Wenn eine statische Funktion keine Nebenwirkungen hat, dann sollte es absolut sicher zu bedienen. Auf der Basis Ihrer Beschreibung der Funktion, scheint es, Nebenwirkungen zu haben, so dass Sie sicherstellen müssen, dass die Funktion von verschiedenen Orten Aufruf keine Konflikte verursacht. Ich kann wirklich nicht sagen, etwas mehr, ohne die Funktion zu sehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top