Heim  >  Artikel  >  Java  >  Detaillierte Einführung in verschiedene Schreibmethoden zur Optimierung der Android-Listenansicht

Detaillierte Einführung in verschiedene Schreibmethoden zur Optimierung der Android-Listenansicht

高洛峰
高洛峰Original
2016-12-13 16:47:261469Durchsuche

Listenansicht
Eine Ansicht, die Seitenelemente in einer vertikal scrollenden Liste anzeigt.
Eine Listenansicht, die vertikal scrollende Elemente anzeigt. In der Android-Entwicklung wird die Listenansicht an vielen Stellen verwendet. Die Verwendung von Listview ist ein Standardadaptermodus, der Daten vom Adapter in der erforderlichen Weise anzeigt. XML beschreibt, wie die Daten angezeigt werden, und diese Aktivitäten werden im gesteuert Aktivität.
Wenn Sie einen benutzerdefinierten Adapter verwenden, müssen Sie die getView-Methode überschreiben, und die getView-Methode generiert die Ansicht und Daten für das Element des Benutzers.
Siehe das Bild:

android listview优化

Hier gibt es eine Optimierung, die darin besteht, Ansichten wiederzuverwenden, was den Speicherverbrauch reduziert und das Laden von Elementen beschleunigt.
Jeder muss Probleme haben, wenn es um die Optimierung in getView geht. Nachfolgend habe ich drei Möglichkeiten zur Optimierung zusammengefasst.
Erstens:
ConvertView wiederverwenden, was den Speicherverbrauch erheblich reduziert. Durch die Beurteilung, ob ConvertView null ist, müssen Sie in diesem Fall eine Ansicht generieren, dann die Ansichtsdaten angeben und die Ansicht schließlich an die unterste Ebene zurückgeben und sie dem Benutzer präsentieren.
Funktionen: Wenn die aktuelle ConvertView null ist, wird über LayoutInflat eine Ansicht generiert.

ViewCode 
publicViewgetView(intposition,ViewconvertView,ViewGroupparent) 
{ 
if(convertView==null) 
{ 
convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 
} 
TextViewtv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); 
TextViewtv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 
ContactInfo1confo=contacts.get(position); 
if(confo!=null){//toseteveryitem'stext 
tv_name.setText(confo.getContactName()); 
tv_phone.setText(confo.getContact_Phone()); 
} 
returnconvertView; 
}

Zweitens:
Die obige Schreibmethode hat einen Nachteil: Jedes Mal, wenn Sie VIEW abrufen, müssen Sie ViewById erneut suchen, das Steuerelement erneut suchen und dann den Wert des Steuerelements zuweisen und Stellen Sie das Ereignis entsprechend ein. Dabei werden tatsächlich sich wiederholende Dinge ausgeführt, da geiview tatsächlich diese Steuerelemente enthält und die IDs dieser Steuerelemente alle gleich sind. Das heißt, Sie müssen ViewById nur einmal in der Ansicht finden, und es ist nicht erforderlich, ViewById jedes Mal zu finden Zeit.
Die zweite Schreibweise ist unten angegeben.
Die Merkmale des Schreibens sind normalerweise ein interner Klassen-ClassViewHolder. Dieser ViewHolder wird verwendet, um einige Steuerelemente in der Ansicht zu identifizieren, um die Einstellung entsprechender Vorgänge für einige Ereignisse zu erleichtern onClick usw. Dadurch entfällt die Notwendigkeit, ViewById jedes Mal zu finden, was den Leistungsverbrauch reduziert. Gleichzeitig wird ConvertView wiederverwendet, was den Speicherverbrauch erheblich reduziert.

ViewCode 
publicViewgetView(intposition,ViewconvertView,ViewGroupparent) 
{ 
ViewHolderholder; 
if(convertView==null){ 
convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 
holder=newViewHolder(); 
holder.tv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); 
holder.tv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 
convertView.setTag(holder); 
} 
else 
{ 
holder=(ViewHolder)convertView.getTag(); 
} 
ContactInfo1confo=contacts.get(position); 
Log.i("my","confo"+confo.getContactName()); 
if(confo!=null){//toseteveryitem'stext 

holder.tv_name.setText(confo.getContactName()); 
holder.tv_phone.setText(confo.getContact_Phone()); 
} 
returnconvertView; 
} 
classViewHolder 
{ 
TextViewtv_name,tv_phone; 
}

Drittens:
Ich persönlich halte diese Schreibweise für die bequemste. Das bequemste bedeutet, dass es sich sehr erfrischend anfühlt, den Code anzusehen, und dass er sehr klar ist.
Funktionen: Verwenden Sie die interne Klasse classViewHolder und verwenden Sie ConvertView wieder.
Der Unterschied zwischen der zweiten Schreibweise besteht darin, dass eine temporäre Variable Viewview=convertView verwendet wird, dann die Ansicht geändert wird und schließlich die Ansicht zurückgegeben wird

ViewCode 
@Override 
publicViewgetView(intposition,ViewconvertView,ViewGroupparent) 
{ 
Viewview=convertView; 
ViewHolderholder; 
if(view==null){ 
view=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 
holder=newViewHolder(); 
holder.tv_name=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name); 
holder.tv_phone=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 
view.setTag(holder); 
} 
else 
{ 
holder=(ViewHolder)view.getTag(); 
} 
ContactInfo1confo=contacts.get(position); 
Log.i("my","confo"+confo.getContactName()); 
if(confo!=null){//toseteveryitem'stext 

holder.tv_name.setText(confo.getContactName()); 
holder.tv_phone.setText(confo.getContact_Phone()); 
} 
returnview; 
} 
classViewHolder 
{ 
TextViewtv_name,tv_phone; 
}

Das Obige ist ein zentralisiertes Schreiben Methode für Anfänger zum Lernen und Zusammenfassen.
Der Quellcode lautet wie folgt: LisViewTest.zip
Laut den Vorschlägen von Freunden unten habe ich festgestellt, dass es noch Bereiche für die Optimierung gibt. Das neueste Update lautet wie folgt:

ViewCode 
@Override 
publicViewgetView(intposition,ViewconvertView,ViewGroupparent) 
{ 
Viewview=convertView; 
ViewHolderholder; 
if(view==null){ 
view=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); 
holder=newViewHolder(); 
holder.tv_name=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name); 
holder.tv_phone=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); 
view.setTag(holder); 
} 
else 
{ 
holder=(ViewHolder)view.getTag(); 
} 
ContactInfo1confo=contacts.get(position); 
Log.i("my","confo"+confo.getContactName()); 
if(confo!=null){//toseteveryitem'stext 

holder.tv_name.setText(confo.getContactName()); 
holder.tv_phone.setText(confo.getContact_Phone()); 
} 
returnview; 
} 
<fontcolor="\"#0000ff\""></font>staticclassViewHolder 
{ 
TextViewtv_name,tv_phone; 
}

Hinweis: staticclassViewHolder
Setzen Sie ViewHolder hier ein. Es ist statisch, das heißt, statische Klassen benötigen nur beim ersten Laden viel Zeit, können aber gleichzeitig beim Laden helfen ist nur ein ViewHolder im Speicher, wodurch Speicheraufwand gespart wird.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn