Ho imparato che per massimizzare l'efficienza con le visualizzazioni di elenco di Android, si dovrebbero avere solo tante visualizzazioni di "righe" gonfiate necessarie per adattarsi allo schermo. Una volta che una vista è stata spostata dallo schermo, è necessario riutilizzarla nel metodo getView
, controllando se convertView
è nullo o meno.Riutilizzo di visualizzazioni in Android Listview con 2 layout diversi
Tuttavia, come è possibile implementare questa idea quando sono necessari 2 layout diversi per l'elenco? Diciamo che è un elenco di ordini e 1 layout è per gli ordini completati e l'altro è per gli ordini di processo.
Questo è un tutorial di esempio dell'idea che il mio codice sta utilizzando. Nel mio caso, avrei layout 2 righe: R.layout.listview_item_product_complete
e 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;
}
Recentemente ho riscontrato questo problema. Stavo usando 2 layout diversi per popolare un listview e ha portato a una completa anarchia. Ho ripassato il mio codice ancora e ancora, ma non sono riuscito a capire perché il layout sbagliato veniva riutilizzato. Alla fine, ho deciso di limitarmi a un solo * layout * per elenco, ma di modificare pesantemente quella vista in base al tipo di elemento. C'è molto che puoi fare per modificare gli elementi nel codice. –