2015-03-12 7 views
7

Cosa succede se ho 50 tipi di visualizzazioni? Devo avere 50 classi interne statiche nel mio adattatore? Secondo this answer, sì.Come gestire molti tipi di visualizzazione diversi nel viewholder Recyclerview

Il mio primo pensiero è stato quello di spostare ogni classe interna dell'osservatore in una classe pubblica separata, ma devono essere statici. Quindi incapsulare ognuno in una classe pubblica, per rendere statica la classe interiore? Esistono alternative più carine?

modifica: codice di esempio: Quindi questa sarebbe una buona soluzione? Questo non uccide anche le prestazioni?

public class MainViewHolder extends DragSortAdapter.ViewHolder implements View.OnClickListener, View.OnLongClickListener { 
View container; 
TextView title; 

//called in onCreateViewHolder in adapter 
public MainViewHolder(DragSortAdapter adapter, View itemView) { 
    super(adapter, itemView); 

    container = itemView.findViewById(R.id.card_root); 

    title = container.findViewById(R.id.text); 
} 
//called by onBindViewHolder in adapter 
public void setData(Data data) { 
    title.setText(data.title); 
} 
} 

EDIT2: campione, perché quando una nuova istanza viene restituita del viewholder

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (viewType) { 
     case 0: return new MainViewHolder(...); 
     case 2: return new MainViewHolderOther(...); 
     ... 
    } 
} 
+0

Perché pensi che una classe di livello superiore non è statico? Puoi aggiungere alcuni esempi di codice per chiarire cosa intendi? – nhaarman

+0

perché devono essere statici? – Blackbelt

+0

@NiekHaarman public class di livello superiore non può essere statico in java. – Tamas

risposta

8

È possibile utilizzare un solo viewHolder classe interna per gestire un sacco di diverso viewType. Per prima cosa devi usare getItemViewType (viewType) per ottenere la posizione dell'articolo e anche usare viewHolder secondo viewType Position.

Creare una classe interna di vieHolder in cui è possibile passare la vista e il tipo di vista in base alla posizione dell'elemento e gonfiare il layout come mostrato di seguito. L'esempio di codice è riportato di seguito.

public class Adapter extends 
     RecyclerView.Adapter<Adapter.MyViewholder> { 

LayoutInflater inflater; 
private Context context; 
ArrayList<Detail> data = new ArrayList<Detail>(); 

public Adapter(Context context, ArrayList<Detail> getdata) { 
    this.context = context; 
    inflater = LayoutInflater.from(context); 
    this.data = getdata; 
} 

class MyViewholder extends RecyclerView.ViewHolder { 
    TextView txtRow, txt_rec; 

    public MyViewholder(View view, int type) { 
     super(view); 

     if (type == Constants.NORMAL) { 
      txtRow = (TextView) view 
        .findViewById(R.id.txtRow); 
     } else if (type == Constants.RECORDING) { 
      txt_rec = (TextView) view 
        .findViewById(R.id.txt_rec); 
     } 
    } 
} 

@Override 
public int getItemCount() { 
    return data.size(); 
} 

@Override 
public void onBindViewHolder(MyViewholder viewholder, int position) { 
    int listViewItemType = getItemViewType(position); 
    Detail detail = data.get(listViewItemType); 
    if (detail.getType() == Constants.NORMAL) { 
     viewholder.txtRow.setText(detail.getKey()); 
    } else if (detail.getType() == Constants.RECORDING) { 
     viewholder.txt_rec.setText(detail.getRecording()); 
    } 

} 

@Override 
public MyViewholder onCreateViewHolder(ViewGroup parent, int viewType) { 

    int listViewItemType = getItemViewType(viewType); 
    switch (listViewItemType) { 
     case 0: 
       view = inflater.inflate(R.layout.detail_item, parent, 
        false); 
      myViewholder = new MyViewholder(view, Constants.NORMAL); 
     case 2: 
      view = inflater.inflate(R.layout.recording, parent, false); 
      myViewholder = new MyViewholder(view, Constants.RECORDING); 
    } 
    return myViewholder; 
} 

@Override 
public int getItemViewType(int position) { 
     return position; 
    } 
} 

Spero che questo codice vi aiuterà a