Patrón ViewHolder correctamente implementado en CursorAdapter personalizado?

Aquí está mi CursorAdapter personalizado:

public class TasksAdapter extends CursorAdapter implements Filterable { private final Context context; public TasksAdapter(Context context, Cursor c) { super(context, c); this.context = context; } /** * @see android.widget.CursorAdapter#newView(android.content.Context, android.database.Cursor, android.view.ViewGroup) */ @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(context); View v = inflater.inflate(android.R.layout.simple_list_item_checked, parent, false); ViewHolder holder = new ViewHolder(); holder.textview = (CheckedTextView)v.findViewById(android.R.id.text1); v.setTag(holder); return v; } /** * @see android.widget.CursorAdapter#bindView(android.view.View, android.content.Context, android.database.Cursor) */ @Override public void bindView(View view, Context context, Cursor cursor) { ViewHolder holder = (ViewHolder)view.getTag(); int titleCol = cursor.getColumnIndexOrThrow(Tasks.TITLE); int completedCol = cursor.getColumnIndexOrThrow(Tasks.COMPLETED); String title = cursor.getString(titleCol); boolean completed = Util.intToBool(cursor.getInt(completedCol)); holder.textview.setText(title); holder.textview.setChecked(completed); } /** * @see android.widget.CursorAdapter#runQueryOnBackgroundThread(java.lang.CharSequence) */ @Override public Cursor runQueryOnBackgroundThread(CharSequence constraint) { StringBuffer buffer = null; String[] args = null; if (constraint != null) { buffer = new StringBuffer(); buffer.append("UPPER ("); buffer.append(Tasks.TITLE); buffer.append(") GLOB ?"); args = new String[] { "*" + constraint.toString().toUpperCase() + "*" }; } Cursor c = context.getContentResolver().query(Tasks.CONTENT_URI, null, (buffer == null ? null : buffer.toString()), args, Tasks.DEFAULT_SORT_ORDER); c.moveToFirst(); return c; } /** * @see android.widget.CursorAdapter#convertToString(android.database.Cursor) */ @Override public CharSequence convertToString(Cursor cursor) { final int titleCol = cursor.getColumnIndexOrThrow(Tasks.TITLE); String title = cursor.getString(titleCol); return title; } static class ViewHolder { CheckedTextView textview; } } 

¿Esto cae en las restricciones del patrón ViewHolder? No estaba seguro porque este era un CursorAdapter, donde no había getView . Si hay algún problema o sugerencia, ¿podría indicarlos?

3 Solutions collect form web for “Patrón ViewHolder correctamente implementado en CursorAdapter personalizado?”

CursorAdapter no llamará al newView cada vez que necesite una nueva fila; Si ya tiene una View , llamará a bindView , por lo que la vista creada es realmente reutilizada.

Dicho esto, como señaló José en los comentarios, todavía puede usar ViewHolder para evitar llamar a findViewById repetidamente.

Si sigue preocupado por la eficiencia, eche un vistazo a la implementación de SimpleCursorAdapter , que utiliza un WeakHashMap (un mapa de WeakReferences ):

 WeakHashMap<View, View[]> mHolders = new WeakHashMap<View, View[]>(); 

Si está reemplazando newView() y bindView() , no necesita hacer nada extra en getView() . CursorAdapter tiene una implementación de getView() que delega a newView() y bindView() para reforzar el reciclaje de filas.

findViewById() puede ser llamado con frecuencia durante el desplazamiento de ListView , lo que puede ralentizar el rendimiento. Incluso cuando el Adapter devuelve una vista inflada para reciclar, todavía necesita buscar los elementos y actualizarlos. Para evitar esto, el patrón ViewHolder es útil.

A continuación, se muestra un ejemplo del patrón de ViewHolder implementado para una aplicación de tiempo:

 public class ForecastAdapter extends CursorAdapter { public ForecastAdapter(Context context, Cursor cursor, int flags) { super(context, cursor, flags); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { View view = LayoutInflater.from(context).inflate( R.layout.list_item_forecast, parent, false); ViewHolder viewHolder = new ViewHolder(view); view.setTag(viewHolder); return view; } @Override public void bindView(View view, Context context, Cursor cursor) { ViewHolder viewHolder = (ViewHolder) view.getTag(); long date = cursor.getLong(ForecastFragment.COL_WEATHER_DATE); viewHolder.dateView.setText("Today"); String weatherForecast = cursor.getString(ForecastFragment.COL_WEATHER_DESC); viewHolder.descriptionView.setText(weatherForecast); double high = cursor.getFloat(ForecastFragment.COL_WEATHER_MAX_TEMP); viewHolder.highTempView.setText("30"); double low = cursor.getFloat(ForecastFragment.COL_WEATHER_MIN_TEMP); viewHolder.lowTempView.setText("24"); int weatherConditionId = cursor.getInt(ForecastFragment.COL_WEATHER_CONDITION_ID); viewHolder.iconView.setImageResource(R.drawable.ic_snow); } /** Cache of the children views for a list item. */ public static class ViewHolder { public final ImageView iconView; public final TextView dateView; public final TextView descriptionView; public final TextView highTempView; public final TextView lowTempView; public ViewHolder(View view) { iconView = (ImageView) view.findViewById(R.id.item_icon); dateView = (TextView) view.findViewById(R.id.item_date_textview); descriptionView = (TextView) view.findViewById(R.id.item_forecast_textview); highTempView = (TextView) view.findViewById(R.id.item_high_textview); lowTempView = (TextView) view.findViewById(R.id.item_low_textview); } } } 

Mi implementación de una clase extiende SimpleCursorAdapter con newView y bindView pero sin el patrón de ViewHolder

  private class CountriesAdapter extends SimpleCursorAdapter { private LayoutInflater mInflater; public CountriesAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to, LayoutInflater inflater) { super(getActivity(), layout, cursor, from, to, CURSOR_ADAPTER_FLAGS); mInflater = inflater; } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return mInflater.inflate(R.layout.countries_list_row, parent, false); } @Override public void bindView(View rowView, Context context, Cursor cursor) { TextView tvCountry = (TextView) rowView.findViewById(R.id.countriesList_tv_countryName); TextView tvOrgs = (TextView) rowView.findViewById(R.id.countriesList_tv_orgNames); ImageView ivContinent = (ImageView) rowView.findViewById(R.id.countriesList_iv_continentName); // TODO: set texts of TextViews and an icon here } } } 
  • Cómo reemplazar / cambiar el botón de la imagen mediante programación android
  • Cambiar el formato de archivo .mp3 al formato de archivo .aac en android mediante la programación java
  • ¿Java sobreescribe XML en Android?
  • ¿Cómo puedo devolver datos en el método de Retrofit onResponse?
  • Guardar ubicación de red como un archivo .txt (sin utilizar GPS)
  • Convertir la matriz de JSON a la lista de objetos de la clase Java
  • Impedir que WebView muestre "página web no disponible"
  • Comportamiento inesperado de StreamTokenizer en Android
  • Intención no se abre en el siguiente código
  • ¿Cómo implementar la función de búsqueda con SearchView, Retrofit y RxJava (RxBindings)?
  • Imprimir unicode personaje Android TextView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.