2017-08-04 1 views
2

je l'habitude d'utiliser une interface pour gérer les clics sur l'élément de la liste, que ce soit pour afficher un message, ou prendre une actionEst-ce une mauvaise pratique de tenir une référence pour l'élément de liste dans la ViewHolder

public interface ItemClickListener { 
void onItemClicked(int adapterPosition); 
} 

@OnClick(R.id.seat_btn) 
protected void click() { 
    if (mItemClickListener != null) 
     mItemClickListener.onItemClicked(getAdapterPosition()); 
} 

Cependant parfois, il est beaucoup plus facile parfois de tenir une référence pour l'objet à l'intérieur du ViewHolder et mettre à jour avec chaque onBindViewHolder appeler et traiter toutes les actions et les changements à l'intérieur du ViewHolder

Seat mSeat; 
@OnClick(R.id.seat_btn) 
protected void click() { 
    seatView.setText(String.value(mSeat.getCount()+1)); 
} 

Alors ma question est « est que considéré comme un mauvaise pratique? "

+0

Vous avez déjà une référence à l'élément de liste dans ViewHolder. Vous pouvez simplement utiliser itemView. Donc, votre question n'est pas claire. – Bob

+0

Je veux dire l'objet Java – atabouraya

Répondre

3

Oui et Non

  • Oui:

Il n'y a rien de mal à avoir votre objet de données à l'intérieur du support de vue. J'ai même vu des cartes avant avec beaucoup de ViewTypes qui ont utilisé une ViewHolder de base avec un paramètre générique T et une méthode abstraite pour lier la vue aux données, comme ceci:

abstract BaseHolder<T> extends ViewHolder { 
    .... constructor... 
    private T t; 

    abstract void bindView(T t); 
} 

C'est un joli motif, isole le voir la liaison au ViewHolder et l'adaptateur distribue simplement ces données aux détenteurs de droits.

  • Mais non:

D'autre part, poignée directement cliquer/événements taper à l'intérieur de ces mêmes supports que je considère comme une mauvaise pratique, il ne devrait pas être la responsabilité de ViewHolder de le faire.

La navigation dans une application, la génération d'appels réseau ou l'insertion d'une base de données doivent être redirigées vers la couche de vue supérieure (activité ou fragment) ou vers un contrôleur capable de gérer correctement la logique isolée.

Normalement sur ces cas, l'on pourrait créer une interface OnEventHappened, par exemple comme ceci:

public interface onEventHappen { 
    void onLikeTapped(MyData data); 
} 

et la classe qui implémente cette interface doit être transmis à l'adaptateur qui passera à la ViewHolder. ViewHolder implémente le View.OnClickListener de base et transmet l'événement avec les données associées à l'objet responsable de gérer cet événement. Quelque chose comme ceci:

MyHolder extends ViewHolder implements View.OnClickListener { 

    private final EventListener listener; 
    private MyData data; // this will be set by adapter or "bind" like explained above 

    public MyHolder(View itemView, EventListener listener) { 
     super(itemView); 
     itemView.findVieById(R.id.button).setOnClickListener(this); 
     this.listener = listener; 
    } 

    @Override public void onClick(View view) { 
     listener.onEvent(data); 
    } 
} 

J'espère que cela aide.