2016-07-10 12 views
0

von @ Daniel Nugget Aswered: Regel für diese Art der Sache, würden Sie Picasso oder Glide verwenden .... hier finden Sie zum Beispiel: https://futurestud.io/blog/picasso-adapter-use-for-listview-gridview-etcetwas Hilfe benötigen Gridview/Listview-Adapter verstehen

Dies ist etwas, das war Seit einiger Zeit belästigt. In einer einfachen Situation würden Sie einen Adapter verwenden, um ein Array von Daten in eine Liste/ein Raster zu konvertieren. In meinem Fall lade ich die Bilder herunter, um sie aus meiner Datenbank zu zeigen. So, während ich nach einer Antwort suchen, warum einige Elemente dupliziert wurden, kam ich accros diesen Beitrag hier:

Items inside GridView getting repeated when screen scrolls

Mit dem folgenden Code:

public View getView(int position, View convertView, ViewGroup parent) { 
    View v; 
    if (convertView == null) { // if it's not recycled, initialize some attributes 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService( Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.gridview_item_layout, parent, false); 
    } else { 
     v = (View) convertView; 
    } 
    TextView text = (TextView)v.findViewById(R.id.grid_item_text); 
    text.setText(mTextIds[position]); 
    ImageView image = (ImageView)v.findViewById(R.id.grid_item_image); 
    image.setImageDrawable(mThumbIds[position]); 
    return v; 
} 

Nun, wenn mein Verständnis korrekt ist, diese Der Code funktioniert wie folgt:

1) Wenn die aktuell überprüfte Ansicht keinen Wert hat, müssen wir sie als neue anzeigen. Daher verwenden wir einen Inflator, um ihm ein Layout zuzuordnen und fügen ihn einem übergeordneten Objekt von viewGroup hinzu (das Grid/Listview).

2) Wenn die gerade überprüfte Ansicht einen Wert hat, geben wir sie einfach so zurück, wie sie war, als sie beim vorherigen Mal erstellt wurde.

3) In beiden Fällen (eine neue oder vorhandene Ansicht) werden wir alle Werte neu zuweisen.

Was ich nicht bekomme, ist, warum alle Werte jedes Mal neu zugewiesen werden müssen, da dies sogar passiert, wenn ich nicht durch meine Grid/ListView scrollte. Das Problem, das ich damit habe ist, dass es wieder scheint, selbst wenn ich nicht blättern werde, wird meine DownloadImageTask (benutzerdefinierte Klasse) immer wieder aufgerufen, und das kostet den Benutzer Internetdaten. Nicht etwas, das für Leute mit begrenzten Daten großartig ist.

Also meine 3 wichtigsten Fragen zusammenzufassen:

1) warum müssen wir die Werte jedes Mal neu zuzuweisen, auch wenn der Blick bereits zuvor erstellt wurde, um duplizierte Elemente zu verhindern?

2) Warum zeigt mir mein Protokoll, dass mein Adapter (und damit das erneute Herunterladen meiner Bilder) etwas unternimmt, auch wenn ich nicht scrolle?

3) kann ich den Code so einstellen, dass meine Bilder nur einmal heruntergeladen werden, und nur für die Artikel, die angezeigt wurden (also müssen wir auf lange Sicht nicht 500 Bilder gleichzeitig herunterladen) und immer noch "speichern", wo das Bild gehört?

+1

Normalerweise für diese Art von Sache würden Sie Picasso oder Glide verwenden .... Sehen Sie hier zum Beispiel: https://futurestud.io/blog/picasso-adapter-use-for-listview-gridview-etc –

+0

Danke, Ich werde es mir ansehen! – sdieters

+0

@DanielNugent Sie sind ein Lebensretter. Es hat mich ein bisschen gekostet, es so zu machen, wie ich es wollte, aber es funktioniert jetzt wie ein Zauber. Wie kann ich Ihren Kommentar als akzeptierte Antwort abgeben? – sdieters

Antwort

1

1) Weil Sie wiederverwenden die View. Sie weisen einem Objekt neue Werte zu, sodass Android Maschinenressourcen speichert, anstatt das Objekt zu entladen und in den Speicher zu laden. Dies wird nicht passieren, es sei denn, Sie scrollen, wenn es tut - Sie tun etwas falsch.

2) Weil Sie etwas falsch machen, ich nehme an, Sie das ist ganze Adapter jedes Mal ein neues Bild aktualisieren beendet Laden, wenn Sie mehr Code schreiben wird - es einfacher zu sagen.

3) Natürlich gibt es viele Techniken, ich schlage vor, Sie lernen über Cache und dealing with large bitmaps zu lernen.

+0

Danke für Ihre Antwort! Das macht Sinn, aber ich weiß nicht, was ich dann falsch gemacht hätte. Ich habe meinen Code zum ursprünglichen Beitrag hinzugefügt. Lust, es auszuprobieren? Ich kam auch nur auf eine Idee, wo ich die heruntergeladenen Bilder zuerst zu einem Bitmap-Array hinzufügen und dann die Bitmaps den Objekten zuweisen. Dies sollte mir ein wenig mehr Kontrolle geben, da ich überprüfen kann, ob die Position in dem Array noch nicht besetzt ist. Ich habe es noch nicht versucht, aber ich werde auf jeden Fall Ihre Links überprüfen! Für die Bitmaps selbst habe ich sichergestellt, dass es sich um Thumbnails handelt, die nicht größer als 150x150 Pixel sind. – sdieters

Verwandte Themen