Was ist der Vorteil von ViewHolder?
Wenn Sie entwickeln ein Android-Programm, und Sie möchten, um eine ArrayAdapter können Sie Einfach eine Klasse (meist mit ViewHolder suffix) oder direkt Blasen Sie Ihre convertView und finden Sie Ihren Blick von id.
Also, Was ist der Vorteil der Verwendung von ViewHolder?
Das Beispiel der beiden hier :
if(convertView==null)
{
convertView = ((Activity)_context).getLayoutInflater().inflate(R.layout.row_phrase, null);
}
((TextView)convertView.findViewById(R.id.txtPhrase)).setText("Phrase 01");
Oder :
static class ViewHolder {
ImageView leftIcon;
TextView upperLabel;
TextView lowerLabel;
}
und schließlich in der getView :
ViewHolder holder = null;
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.row_layout,
null, false);
holder = new ViewHolder();
holder.leftIcon = (ImageView) view.findViewById(R.id.leftIcon);
InformationsquelleAutor der Frage mohammad jannesary | 2014-02-01
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verstehen, wie listview-recycling funktioniert
Wie ListView-recycling-Mechanismus funktioniert
Kann man nicht recyceln eine Zeile, die gegenwärtig in Gebrauch. Der link oben erklärt, wie listview-recycling-Mechanismus funktioniert
Zitieren docs
Ihren code nennen könnte
findViewById()
Häufig während des scrollen der ListView, die verlangsamen kann die Leistung. Auch wenn der Adapter gibt eine inflationäre Sicht für das recycling, die Sie noch brauchen, um die Elemente, und aktualisieren Sie Sie. Ein Weg, um die wiederholte Verwendung vonfindViewById()
"anzeigen-Halter - "design pattern".Verpasst du der wichtige Teil
convertView.setTag(holder)
undholder = (ViewHolder) ConvertView.getTag()
http://developer.android.com/training/improving-layouts/smooth-scrolling.html
InformationsquelleAutor der Antwort Raghunandan
ViewHolder
design-Muster wird verwendet, um die Geschwindigkeit des Renderns IhrerListView
- eigentlich, um es reibungslos funktionieren, findViewById ist Recht teuer (es muss DOM-parsing), wenn verwendet, jedes mal, wenn ein list-Element gerendert wird, kann es Durchlaufen muss Ihr layout-Hierarchieund auch Objekte instanziieren. Da die Listen neu zeichnen kann seine items Recht Häufig beim scrollen solchen Aufwand könnte erheblich sein.finden Sie eine gute Erklärung, wie das funktioniert :
http://www.youtube.com/watch?v=wDBM6wVEO70&feature=youtu.werden&t=7m
ab minute 10, Sie haben erklärt, ViewHolder design-Muster von google-Experten.
[Bearbeiten]
findViewById ist nicht die Instanzierung neuer Objekte, die es nur durchläuft Hierarchie - hier ist Referenz http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/view/ViewGroup.java#3610
InformationsquelleAutor der Antwort marcinj
Als Sie schleudern durch Ihre ListView, es gibt nur eine Handvoll von Ansichten gezeigt. Dies bedeutet, dass Sie nicht haben, zu instanziieren, die eine Ansicht für jedes Element in dem adapter, wenn eine Ansicht Schriftrollen off-screen, es kann wiederverwendet werden, oder recycelt.
Ansicht recycling und die ViewHolder pattern sind nicht das gleiche. Der ViewHolder pattern, ist allein die Reduzierung der Anzahl der
view.findViewById(int)
Anrufe, die Sie machen. Der ViewHolder pattern funktioniert nur, wenn Sie die Vorteile der Ansicht recycling.In
getView(int position, View convertView, ViewGroup parent)
dieconvertView
parameter ist entweder null oder es ist eine Ansicht, die recycelt wurde: es wird immer noch die Daten aus einer anderen Liste Element gebunden.Ohne das ViewHolder pattern, können Sie dennoch die Vorteile der Ansicht recycling (d.h. nicht blind zu instanziieren Ansichten):
Oben ist ein Beispiel-Ansicht recycling - wir Pumpen eine neue Ansicht für jede Zeile; wir haben nur aufblasen einer Sicht, wenn wir nicht gegeben, die man wiederverwenden. Vermeiden, dass zum aufblasen eine Ansicht ist, der Teil wird auf jeden Fall helfen mit der performance beim scrollen durch die Liste: profitieren Sie von Sicht-recycling.
So, was ist das ViewHolder denn dann? Wir sind derzeit dabei 4x
findViewById(int)
für jeder Element, unabhängig davon, ob die Zeile bereits existiert. AlsfindViewById(int)
rekursiv iteriert unten eine ViewGroup, bis es findet ein untergeordnetes Element mit der angegebenen ID, das ist ein bisschen sinnlos für unsere Recycling-Ansichten - wir sind re-die Suche nach Ansichten, die wir bereits haben, Verweise auf.Vermeiden Sie dies, indem Sie ein ViewHolder-Objekt Verweise auf die sub-views nachdem Sie "finden" Sie:
View.setTag(Object)
ermöglicht Ihnen die Ansicht zu halten Sie ein beliebiges Objekt. Wenn wir es verwenden, um eine Instanz unserer ViewHolder nach wir tun unserfindViewById(int)
anrufen, dann können wirView.getTag()
auf Recycling-Ansichten zu vermeiden, dass die Aufrufe immer und immer wieder.Die performance Vorteile dieser Optimierung ist fraglichaber das ist die profitieren Sie von den ViewHolder.
InformationsquelleAutor der Antwort ataulm
Erstens :
In
ListView
wenn Sie scrollen Sie dieListView
Sie brauchen, zu erstellen, neue Artikel und binden Sie Ihre Daten auf es so dass, wenn Sie haben viel Elemente inListView
es kann zu Speicherverlust, da mehr Objekte, die Sie erstellt für die Elemente , aber Android mit Konzept der wiederverwertung die meisten der API , und es heißt, Sie erstellen ein Objekt und verwenden Sie es, anstatt es zu zerstören und zu erklären, neue , also, wenn Sie einen BildlaufListView
- API mithilfe der unsichtbaren Elemente, die Sie durchgeblättert und pass es für Sie ingetView
Methode ist esconvertView
so, hier beschäftigen Sie sich mit weiteren ElementenListView
Zweitens :
wenn Sie benutzerdefinierte Element in
ListView
müssen Sie Ihre benutzerdefinierten Layout für jedes Element derListView
so werden Sie jedes mal, wennListView
binden neue Element mitfindViewById
zu Holen Verweis auf die layout-Elemente. Diese Methode wird zur Suche für Ihren Artikel in rekursiver Weise, so dass SieViewHolder
wird Ihnen helfen, um die rekursive gemacht für nur ein mal und dann wird es den Verweis auf die layout-Element für Sie, bis Sie befestigen kann es fürListView
hoffe, dies hilft Ihnen und füttern Sie mich zurück in irgendeine nicht offensichtliche Sache
InformationsquelleAutor der Antwort mohammed momn