¿Cómo puedo hacer que mi ArrayAdapter siga el patrón ViewHolder?
Aquí está mi ArrayAdapter. Me gustaría hacer esto más eficiente siguiendo el patrón de ViewHolder:
Http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html
- Dos vistas de lista a la vez con la mitad deslizante viewpager android
- OnItemClickListener no funciona con el elemento ListView que contiene el botón
- Android - ¿Cómo puedo medir el rendimiento de ListView y otras vistas?
- Vista de lista de Android con el problema de la casilla de verificación
- Android: ¿Por qué un clic largo también activa un clic normal?
Pero no estoy seguro de cómo lograr esto.
UPDATE: Patrón de ViewHolder
private class QuoteAdapter extends ArrayAdapter<Quote> { private ArrayList<Quote> items; // used to keep selected position in ListView private int selectedPos = -1; // init value for not-selected public QuoteAdapter(Context context, int textViewResourceId, ArrayList<Quote> items) { super(context, textViewResourceId, items); this.items = items; } public void setSelectedPosition(int pos) { selectedPos = pos; // inform the view of this change notifyDataSetChanged(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder holder; // to reference the child views for later actions if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.mainrow, null); // cache view fields into the holder holder = new ViewHolder(); holder.nameText = (TextView) v.findViewById(R.id.nameText); holder.priceText = (TextView) v.findViewById(R.id.priceText); holder.changeText = (TextView) v.findViewById(R.id.changeText); // associate the holder with the view for later lookup v.setTag(holder); } else { // view already exists, get the holder instance from the view holder = (ViewHolder)v.getTag(); } // change the row color based on selected state if (selectedPos == position) { v.setBackgroundResource(R.drawable.stocks_selected_gradient); holder.nameText.setTextColor(Color.WHITE); holder.priceText.setTextColor(Color.WHITE); holder.changeText.setTextColor(Color.WHITE); } else { v.setBackgroundResource(R.drawable.stocks_gradient); holder.nameText.setTextAppearance(getApplicationContext(), R.style.BlueText); holder.priceText.setTextAppearance(getApplicationContext(), R.style.BlueText); holder.changeText.setTextAppearance(getApplicationContext(), R.style.BlueText); } Quote q = items.get(position); if (q != null) { if (holder.nameText != null) { holder.nameText.setText(q.getSymbol()); } if (holder.priceText != null) { holder.priceText.setText(q.getLastTradePriceOnly()); } if (holder.changeText != null) { try { float floatedChange = Float.valueOf(q.getChange()); if (floatedChange < 0) { if (selectedPos != position) holder.changeText.setTextAppearance(getApplicationContext(), R.style.RedText); // red } else { if (selectedPos != position) holder.changeText.setTextAppearance(getApplicationContext(), R.style.GreenText); // green } } catch (NumberFormatException e) { System.out.println("not a number"); } catch (NullPointerException e) { System.out.println("null number"); } holder.changeText.setText(q.getChange() + " (" + q.getPercentChange() + ")"); } } return v; } }
- Swipeleft para eliminar no funciona en la altura expandible listview
- Cómo crear DrawerLayout programaticamente
- Necesito llamar a un número perticular en los contactos
- Configuración de la transparencia alfa en un listView android
- ¿Mi proceso de almacenamiento en caché de imágenes va a perder memoria?
- Android - autoLink
- ¿Qué es android.R.layout.simple_list_item_1?
- Dar etiquetas de los elementos de la lista de visualización sin el arrayadapter personalizado
El ViewHolder es básicamente una instancia de clase estática que se asocia con una vista cuando se crea, almacenando en caché las vistas secundarias que está buscando en tiempo de ejecución. Si la vista ya existe, recuperar la instancia de titular y utilizar sus campos en lugar de llamar a findViewById
.
En tu caso:
@Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder holder; // to reference the child views for later actions if (v == null) { LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.mainrow, null); // cache view fields into the holder holder = new ViewHolder(); holder.nameText = (TextView) v.findViewById(R.id.nameText); holder.priceText = (TextView) v.findViewById(R.id.priceText); holder.changeText = (TextView) v.findViewById(R.id.changeText); // associate the holder with the view for later lookup v.setTag(holder); } else { // view already exists, get the holder instance from the view holder = (ViewHolder) v.getTag(); } // no local variables with findViewById here // use holder.nameText where you were // using the local variable nameText before return v; } // somewhere else in your class definition static class ViewHolder { TextView nameText; TextView priceText; TextView changeText; }
Advertencia: No intenté compilar esto, así que tome con un grano de sal.