java example - Riutilizzo di visualizzazioni in Listview Android con 2 layout diversi




1 Answers

È necessario consentire al riciclatore della vista dell'adattatore di sapere che esiste più di un layout e come distinguere tra i due per ogni riga. Basta sovrascrivere questi metodi:

@Override
public int getItemViewType(int position) {
    // Define a way to determine which layout to use, here it's just evens and odds.
    return position % 2;
}

@Override
public int getViewTypeCount() {
    return 2; // Count of different layouts
}

Incorporate getItemViewType() all'interno di getView() , come questo:

if (convertView == null) {
    // You can move this line into your constructor, the inflater service won't change.
    mInflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
    if(getItemViewType(position) == 0)
        convertView = mInflater.inflate(R.layout.listview_item_product_complete, parent, false);
    else
        convertView = mInflater.inflate(R.layout.listview_item_product_inprocess, parent, false);
    // etc, etc...

Guarda il Romain Guy di Android discutere del riciclatore di view su Google Talks.

gridview array

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;
}



Related