Pytanie RecyclerView z różnymi Cardlayouts


Co chciałbym zrobić


W tej chwili bawię się z RecyclerView i CardView. Na razie napisałem RecyclerView.Adapter na którym mogę wyświetlać ten sam CardView wiele razy z inną zawartością - analogiczną do ListView z a BaseAdapter.

Teraz chciałbym napisać RecyclerView z innym CardView-Layout(w stylu Google Now). Już szukałem samouczków, ale nie znalazłem nic przydatnego w tym temacie. Czy ktoś wie, jak to musi być wdrożone? Co trzeba zrobić, aby to zrozumieć?


12
2018-01-23 12:34


pochodzenie


developer.android.com/training/material/lists-cards.html. A w przypadku różnych układów wystarczy zmienić parametr ViewType na karcie - Pedro Oliveira
@PedroOliveira Już to przeczytałem, ale pokazuje tylko, jak to jest z jedną kartą, a nie z różnymi. - safari
Musisz przesłonić getItemViewType na swoim adapterze i zwróć inny typ widoku, dzięki czemu możesz nadmuchać różne układy na swoim onCreateViewHolder (który odbiera typ widoku jako parametr 2º) - Pedro Oliveira
@PedroOliveira czy masz na to krótki przykład? - safari
stackoverflow.com/a/25960103/3410697 lub stackoverflow.com/a/26245463/3410697 - Pedro Oliveira


Odpowiedzi:


Aby osiągnąć to, czego chcesz, musisz przesłonić getItemViewType(position) na Twoim RecyclerView.Adapter, Gdzie wrócisz int z informacją, jaki widok będzie używany do reprezentowania tej pozycji.

Następnie będziesz tworzyć różne ViewHolders na createViewHolder (parent,viewType) który zachowa odniesienia do każdego odrębnego CardLayout w twoim przypadku.

Następnie bindViewHolder(holder, position) możesz utworzyć instrukcję switch lub, jeśli nie chcesz, przeglądać listę możliwych widoków i wypełniać je danymi.

Przykładowy kod poniżej:

public GeneralViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

    GeneralViewHolder holder;
    View v;
    Context context = viewGroup.getContext();

    if (viewType == FIRST_TYPE) {
        v = LayoutInflater.from(context)
                .inflate(R.layout.first_card, viewGroup, false);

        holder = new FirstTypeViewHolder(v); //Of type GeneralViewHolder
    } else {
        v = LayoutInflater.from(context)
                .inflate(R.layout.second_card, viewGroup, false);
        holder = new SecondTypeViewHolder(v);
    }

    return holder;
}

public void onBindViewHolder(GeneralViewHolder viewHolder, int i) {
    if(getItemViewType(i)==FIRST_TYPE) {
        FirstTypeViewHolder holder1 = (FirstTypeViewHolder)viewHolder;
    } else {
        SecondTypeViewHolder holder1 = (SecondTypeViewHolder)viewHolder;
    }
}

public int getItemViewType (int position) {
    //Some logic to know which type will come next;
    return Math.random()<0.5 ? FIRST_TYPE : SECOND_TYPE;
}

16
2018-01-23 12:52



to jest świetne, dziękuję, spróbuję tego. :-)! +1 - safari