Ich habe gelernt, dass zur Maximierung der Effizienz mit Android-Listenansichten nur so viele aufgeblähte Zeilenansichten vorhanden sein sollten, wie auf dem Bildschirm angezeigt werden müssen. Sobald eine Ansicht vom Bildschirm verschwunden ist, sollten Sie sie erneut in Ihrer getView
-Methode verwenden und prüfen, ob convertView
Null ist oder nicht.Ansichten in Android Listview mit zwei verschiedenen Layouts wiederverwenden
Wie können Sie diese Idee jedoch implementieren, wenn Sie zwei verschiedene Layouts für die Liste benötigen? Sagen wir, es ist eine Liste von Bestellungen und 1 Layout ist für abgeschlossene Bestellungen und das andere Layout ist für in Bearbeitung Bestellungen.
Dies ist ein Beispiel-Tutorial der Idee, die mein Code verwendet. In meinem Fall würde ich 2 Reihe Layouts: R.layout.listview_item_product_complete
und R.layout.listview_item_product_inprocess
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
if(getItemViewType(position) == COMPLETE_TYPE_INDEX) {
convertView = mInflator.inflate(R.layout.listview_item_product_complete, null);
holder.mNameTextView = (TextView) convertView.findViewById(R.list.text_complete);
holder.mImgImageView = (ImageView) convertView.findViewById(R.list.img_complete);
}
else { // must be INPROCESS_TYPE_INDEX
convertView = mInflator.inflate(R.layout.listview_item_product_inprocess, null);
holder.mNameTextView = (TextView) convertView.findViewById(R.list.text_inprocess);
holder.mImgImageView = (ImageView) convertView.findViewById(R.list.img_inprocess);
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
thisOrder = (Order) myOrders.getOrderList().get(position);
// If using different views for each type, use an if statement to test for type, like above
holder.mNameTextView.setText(thisOrder.getNameValue());
holder.mImgImageView.setImageResource(thisOrder.getIconValue());
return convertView;
}
public static class ViewHolder {
public TextView mNameTextView;
public ImageView mImgImageView;
}
Ich bin dieses Problem vor kurzem selbst begegnet. Ich benutzte 2 verschiedene Layouts, um eine Listenansicht zu füllen, und das führte zu vollständiger Anarchie. Ich habe meinen Code immer wieder durchgegangen, konnte aber nicht herausfinden, warum das falsche Layout wiederverwendet wurde. Am Ende entschied ich mich, nur mit einem * Layout pro Liste zu arbeiten, aber diese Ansicht basierend auf dem Elementtyp stark zu modifizieren. Es gibt viel, was Sie tun können, um Elemente im Code zu bearbeiten. –