2015-03-12 15 views
7

Co zrobić, jeśli mam 50 typów widoków? Czy powinienem mieć 50 statycznych klas wewnętrznych w moim adapterze? Zgodnie z this answer, tak.Jak obsługiwać wiele różnych typów widoku w przeglądarce widoku recyklerów

Moja pierwsza myśl polegała na tym, aby przenieść każdą wewnętrzną klasę widoku do oddzielnej klasy publicznej, ale muszą one być statyczne. Więc zamknij każdą z nich w klasie publicznej, aby klasa wewnętrzna stała się statyczna? Czy są jakieś fajniejsze alternatywy?

edytuj: kod przykładowy: To byłoby dobre rozwiązanie? Czy to też nie zabija wydajności?

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: próbki, na kiedy nowa instancja jest zwracany z viewholder

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

Dlaczego sądzisz klasy najwyższego poziomu nie jest statyczny? Czy możesz dodać przykłady kodu, aby wyjaśnić, co masz na myśli? – nhaarman

+0

dlaczego muszą być statyczne? – Blackbelt

+0

@NiekHaarman klasa publiczna najwyższego poziomu nie może być statyczna w java. – Tamas

Odpowiedz

8

Można użyć tylko jednego viewHolder wewnętrzną klasę do obsługi wielu różnych viewType. Najpierw musisz użyć getItemViewType (viewType), aby uzyskać pozycję pozycji , a także musisz użyć viewHolder zgodnie z ViewType Position.

Utwórz jedną klasę wewnętrzną vieHolder, w której możesz przekazać widok i typ widoku zgodnie z pozycją elementu i nadmuchać układ, jak pokazano poniżej. Próbka kodu jest podana poniżej.

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

Nadzieja ten kod pomoże

Powiązane problemy