Nauczyłem się, że aby zmaksymalizować wydajność dzięki Android Listview, powinieneś mieć tylko tyle zawyżonych widoków "rzędu", ile potrzeba, aby zmieścić się na ekranie. Gdy widok zniknie z ekranu, należy go ponownie użyć w metodzie getView
, sprawdzając, czy convertView
ma wartość null, czy nie.Ponowne wykorzystywanie widoków w widoku list w systemie Android z 2 różnymi układami
Jak jednak wdrożyć ten pomysł, gdy potrzebujesz 2 różnych układów dla listy? Powiedzmy, że jest to lista zamówień, a 1 układ dotyczy zamówień zakończonych, a drugi układ dotyczy zamówień procesowych.
Oto przykładowy samouczek idei, której używa mój kod. W moim przypadku, chciałbym mieć układy 2 rząd: R.layout.listview_item_product_complete
i 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;
}
Sam ostatnio napotkałem ten problem. Używałem 2 różnych układów do wypełnienia listy, co zaowocowało kompletną anarchią. Raz po raz sprawdzałem swój kod, ale nie mogłem zrozumieć, dlaczego niewłaściwy układ został ponownie użyty. Ostatecznie zdecydowałem, że pozostanie tylko jeden * układ na liście, ale silnie modyfikuję ten widok na podstawie typu elementu. Istnieje wiele możliwości edycji elementów w kodzie. –