[java] Riutilizzo di visualizzazioni in Listview Android con 2 layout diversi



Answers

Non c'è bisogno di progettare una soluzione da soli, basta eseguire getItemViewType () e getViewTypeCount ().

Vedere il seguente post sul blog per un esempio http://sparetimedev.blogspot.co.uk/2012/10/recycling-of-views-with-heterogeneous.html

Come spiega il blog, Android in realtà non garantisce che getView riceverà il tipo di visualizzazione corretto.

Question

Ho imparato che per massimizzare l'efficienza con le visualizzazioni di elenchi su Android, dovresti 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.

Tuttavia, come si può implementare questa idea quando sono necessari 2 layout diversi per la lista? 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 usando. Nel mio caso, avrei 2 layout di riga: 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;
}



Links