2017-05-03 1 views
0

Quelle est l'utilité de ViewHolder dans une coutume Adapter?Utilitaire de ViewHolder dans un adaptateur personnalisé

J'ai créé un Adapter en utilisant le ViewHolder et un autre sans et j'ai le même résultat ... quelle en est l'utilité?


Ceci est mon CustomAdapter.class avec le ViewHolder:

public class CustomAdapter extends ArrayAdapter<Fruit> { 

    public class ViewHolder { 
     TextView txtName; 
     TextView txtColor; 
    } 

    CustomAdapter(Context context, ArrayList<Fruit> data) { 
     super(context, R.layout.item_fruit, data); 
    } 

    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 

     final Fruit fruit = getItem(position); 

     ViewHolder viewHolder = new ViewHolder(); 

     if (convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(R.layout.item_fruit, parent, false); 
     } 

     viewHolder.txtName = (TextView) convertView.findViewById(R.id.textView_fruit_name); 
     viewHolder.txtColor = (TextView) convertView.findViewById(R.id.textView_fruit_color); 

     if (fruit != null) { 
      viewHolder.txtName.setText(fruit.getName()); 
      viewHolder.txtColor.setText(fruit.getColor()); 
     } 

     return convertView; 
    } 
} 

Ceci est mon CustomAdapter.class sans ViewHolder:

public class CustomAdapter extends ArrayAdapter<Fruit> { 

    CustomAdapter(Context context, ArrayList<Fruit> data) { 
     super(context, R.layout.item_fruit, data); 
    } 

    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 

     final Fruit fruit = getItem(position); 

     if (convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(R.layout.item_fruit, parent, false); 
     } 

     TextView txtName = (TextView) convertView.findViewById(R.id.textView_fruit_name); 
     TextView txtColor = (TextView) convertView.findViewById(R.id.textView_fruit_color); 

     if (fruit != null) { 
      txtName.setText(fruit.getName()); 
      txtColor.setText(fruit.getColor()); 
     } 

     return convertView; 
    } 
} 
+0

Vous n'utilisez pas correctement le modèle de viewholder. Vous devez initialiser le viewholder et les vues à l'intérieur du bloc 'if (convertView == null)' et utiliser 'setTag' et' getTag' pour récupérer le viewHolder – akash93

+0

Voici une meilleure réponse à votre question
[Link] (http : //stackoverflow.com/questions/21501316/what-is-the-benefit-of-viewholder) –

Répondre

1

Pour utiliser ViewHolder correctement, vous devez changer votre code à quelque chose comme:

@NonNull 
@Override 
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 

    final Fruit fruit = getItem(position); 

    if (convertView == null) { 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     convertView = inflater.inflate(R.layout.item_fruit, parent, false); 
     convertView.setTag(new ViewHolder(convertView)); 
    } 

    ViewHolder viewHolder = (ViewHolder) convertView.getTag(); 

    viewHolder.txtName = (TextView) convertView.findViewById(R.id.textView_fruit_name); 
    viewHolder.txtColor = (TextView) convertView.findViewById(R.id.textView_fruit_color); 

    if (fruit != null) { 
     viewHolder.txtName.setText(fruit.getName()); 
     viewHolder.txtColor.setText(fruit.getColor()); 
    } 

    return convertView; 
} 

Et votre ViewHolder sera quelque chose comme:

private class ViewHolder { 
    public TextView txtName; 
    public TextView txtColor; 

    public ViewHolder(View view) { 
     txtName = (TextView) view.findViewById(R.id.txt_name); 
     txtColor = (TextView) view.findViewById(R.id.txt_color); 
    } 
} 

Calling findViewById() est cher, appeler votre point de vue pour chaque appel à getView() va perdre beaucoup de temps.

L'avantage unique d'utiliser ViewHolder est de gagner du temps en ne demandant pas findViewById() lorsqu'une vue est réutilisée, à savoir quand convertView n'est pas null.

+0

Merci mais dans la ligne convertView.setTag (nouveau ViewHolder (convertView)); , il a une erreur ViewHolder() dans ViewHolder ne peut pas être appliqué à (android.view.View) –

+1

Vérifiez la réponse mise à jour pour voir comment 'ViewHolder' est censé être écrit. –