¿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
- Implementación de onScrollListener para detectar el final de desplazamiento en un ListView
- ¿Cómo agregar un listview dentro de un viewpager?
- ¿Cómo puedo evitar que el pie de página de ListView se seleccione?
- Getview parámetro "convertview" no nulo en el nuevo parámetro "posición"
- Deshabilitar el desplazamiento en la vista de lista
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; } }
- ListView - Imágenes barajadas al desplazarse
- ListView circular (elementos en el medio círculo)
- ¿Cómo puedo eliminar líneas entre ListViews en Android?
- ArrayAdapter: debe proporcionar un id de recurso para una vista de texto
- Cómo cancelar AsyncTask ejecutar desde el elemento oculto en la función getView () en Android?
- ¿Cuál usar WebView o TextView en una lista con datos HTML en ella?
- Detener el controlador después de que se haya destruido el fragmento
- SmoothScrollToPosition no funciona?
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.