2015-03-17 12 views
14

Chcę wyświetlić przycisk na końcu okna RecyclerView.Jak dodać przycisk na końcu okna RecyclerView?

Z ListView była metoda addFooterView(), jak zrobić to samo z RecylerView.

+0

Jeśli nie jest przewijanie, to po prostu dodaj go do swojego xml. –

+0

Widok RecyclerView jest tworzony dynamicznie. Próbowałem to, co powiedziałeś, i włożyłem przycisk tuż nad RecyclerView. I tak jest przewijanie. –

+0

https://github.com/cymcsg/UltimateRecyclerView – Yogendra

Odpowiedz

22

Jednym ze sposobów na zrobienie tego byłoby uczynienie stopki widoku typu "ViewType" adaptera. W tym celu zastępuje getItemViewType, aby zwrócić inną wartość dla ostatniego przedmiotu.

@Override 
public int getItemViewType(int position) { 
    return (position == mData.size()) ? VIEW_TYPE_FOOTER : VIEW_TYPE_CELL; 
} 

Następnie w onCreateViewHolder obsługuje różne viewType.

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    if (viewType == VIEW_TYPE_CELL) { 

     //Create viewholder for your default cell 
    } 
    else { 

     //Create viewholder for your footer view 
    } 
} 

Nie zapomnij zaktualizować wartość o zwrot getCount() przez dodanie 1 i rozróżnić 2 rodzaje ViewHolder w OnBindViewHolder (z instanceof na przykład).

+0

Dzięki Crumble. –

20

Natknąłem się na ten problem i znalazłem tę odpowiedź. Bieżąca wybrana odpowiedź jest poprawna, ale brakuje niektórych szczegółów. Oto pełna realizacja,

Dodaj tę metodę do adaptera

@Override 
public int getItemViewType(int position) { 
    return (position == myItems.size()) ? R.layout.button : R.layout.item; 
} 

będzie sprawdzić, czy aktualna pozycja jest obok ostatniej pozycji na liście, jeśli jest to zwróci wartość układ przycisków tej metodzie

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

    View itemView; 

    if(viewType == R.layout.item){ 
     itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); 
    } 

    else { 
     itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.button, parent, false); 
    } 

    return new MyViewHolder(itemView); 
} 

Powyższe metody sprawdza, czy przekazany viewType jest układ item lub układ button a następnie napełnia się na stanowisku occordingly i wysyła nadmuchanej widok z tym sposobem,

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    if(position == myItems.size()) { 
     holder.button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(context, "Button Clicked", Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 
    else { 
     final String name = myItems.get(position); 
     holder.title.setText(name); 
    } 
} 

ta sprawdza, czy jesteśmy za ostatnim item na liście, a jeśli mamy to Ustawia metodę do naszego przycisku onClick. W przeciwnym razie tworzy się normalnie.

Musimy także zmienić metodę getItemCount do tego

@Override 
public int getItemCount() { 
    return myItems.size() + 1; 
} 

Ponieważ jesteśmy przechodząc przez wszystkie items a następnie dodanie button w końcu, + 1 jest nasz przycisk.

Wtedy wreszcie musimy dodać nasz pogląd do klasy

public class MyViewHolder extends RecyclerView.ViewHolder { 
    public TextView title; 
    public Button button; 

    public MyViewHolder(View view) { 
     super(view); 
     title = (TextView) view.findViewById(R.id.title); 
     button = (Button) view.findViewById(R.id.bottom_button); 
    } 
} 

myViewHolder Mam nadzieję, że to pomaga!

+2

To naprawdę mi pomogło @Gary –

+0

@Gary Czy musimy dodać nasz przycisk do tego samego układu xml R.id.title znajduje się wewnątrz? Jeśli tak, czy przycisk nie pojawi się za każdym razem, gdy układ zawierający tytuł zostanie narysowany, ponieważ zostaną one zadeklarowane w tym samym układzie? – Cody

+1

@Cody Nie, przycisk i element powinny znajdować się w dwóch oddzielnych plikach xml. –

Powiązane problemy