Le modèle ViewHolder est correctement implémenté dans CursorAdapter personnalisé?

Voici mon CursorAdapter personnalisé:

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

Est-ce que cela tombe dans les contraintes du modèle ViewHolder? Je n'étais pas sûr car il s'agissait d'un CursorAdapter, où il n'y avait pas de getView . S'il y a des problèmes ou des suggestions, pouvez-vous les signaler.

  • Comment lier deux activités Android à un seul service?
  • GetSize () me donnant des erreurs
  • Comment créer une fonction kernel linux à ftrace function_graph tracer?
  • Adresse de tas invalide et signal fatal 11
  • Les clics ne fonctionnent pas dans WebView
  • Erreur lors de la récupération du parent pour l'élément - Android Studio
  • 3 Solutions collect form web for “Le modèle ViewHolder est correctement implémenté dans CursorAdapter personnalisé?”

    CursorAdapter n'appellera pas le newView chaque fois qu'il nécessite une nouvelle ligne; Si elle a déjà une View , elle appellera bindView , de sorte que la vue créée est effectivement réutilisée.

    Cela dit, comme l'a souligné Joseph dans les commentaires, vous pouvez toujours utiliser ViewHolder afin d'éviter d'appeler findViewById plusieurs reprises.

    Si vous êtes toujours préoccupé par l'efficacité, regardez l'implémentation SimpleCursorAdapter , qui utilise un WeakHashMap (une carte de WeakReferences ):

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

    Si vous newView() et bindView() , vous n'avez pas besoin de faire quelque chose de plus dans getView() . CursorAdapter a une implémentation de getView() qui délègue à newView() et bindView() pour appliquer le recyclage de lignes.

    findViewById() peut-être appelé fréquemment pendant le défilement de ListView , ce qui peut ralentir les performances. Même lorsque l' Adapter renvoie une vue gonflable pour le recyclage, vous devez toujours rechercher les éléments et les mettre à jour. Pour éviter cela, le modèle ViewHolder est utile.

    Voici un exemple de ViewHolder implémenté pour une application météorologique:

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

    Ma mise en œuvre d'une classe étend SimpleCursorAdapter avec newView et bindView mais sans le motif 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 } } } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.