web-dev-qa-db-fra.com

Comment ajouter un bouton à la fin de RecyclerView?

Je souhaite afficher un bouton à la fin de RecyclerView.

Avec ListView il y avait une méthode addFooterView (), comment faire la même chose avec RecylerView.

21
Vrutin Rathod

Une façon de le faire consiste à faire de votre pied de page un "ViewType" de votre adaptateur. Pour ce faire, remplace getItemViewType afin de renvoyer une valeur différente pour votre dernier élément.

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

Ensuite, dans onCreateViewHolder, gérez les différents 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
    }
}

N'oubliez pas de mettre à jour la valeur renvoyée par getCount () en ajoutant 1, et de distinguer les 2 types de ViewHolder dans OnBindViewHolder (avec instanceof par exemple).

33
Gyome

Je suis tombé sur ce problème et j'ai trouvé cette réponse. La réponse actuellement sélectionnée est correcte mais il manque quelques détails. Voici la mise en œuvre complète,

Ajouter cette méthode à votre adaptateur

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

Il vérifiera si la position actuelle dépasse le dernier élément de votre liste. Si c'est le cas, il retournera la valeur de présentation du bouton à cette méthode.

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

La méthode ci-dessus vérifie si la viewType transmise est la disposition item ou la disposition button, puis gonfle la vue de façon ordonnée et envoie la vue gonflée à cette méthode.

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

Cela vérifie si nous avons dépassé la dernière item de la liste et si nous le sommes, la méthode onClick est définie sur notre bouton. Sinon, cela crée une item comme d'habitude.

Nous devons aussi changer la méthode getItemCount en ceci

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

Puisque nous parcourons toute la items et que nous ajoutons ensuite une button à la fin, le + 1 est notre bouton.

Enfin, nous devons ajouter notre vue à la classe myViewHolder

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

J'espère que ça aide!

31
Gary Holiday

Il existe un moyen très simple d’obtenir D’abord, vous devez ajouter +1 à la taille de la liste.

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

puis vérifiez si la position de la liste est plus grande que la taille de la liste faites quelque chose. dans mon cas:

        if (position == badgesModels.size()) {
            holder.imageViewBadege.setImageDrawable(getResources().getDrawable(R.drawable.plus));
            holder.imageViewBadege.setBackgroundColor(getResources().getColor(R.color.bg_gray));
            holder.textViewBadgeTitle.setText("Make Badge");

            holder.imageViewBadege.setOnClickListener(v -> {
                ListDialog.newInstanceChooseBadge().show(Objects.requireNonNull(getFragmentManager()),"makeBadge");
            });
        } else {
            GlideApp.with(Objects.requireNonNull(getContext())).load(results.get(position).getImage_link()).placeholder(R.drawable.badge).into(holder.imageViewBadege);
            holder.textViewBadgeTitle.setText(results.get(position).getTitle());
            holder.imageViewBadege.setOnClickListener(v -> {
                apiService.assginBadgesStudent(classId, studentId, results.get(position).getId());
                dismiss();
                Objects.requireNonNull(getTargetFragment()).onResume();
                playFromAsset("sounds/Ding.wav");
            });
        }
0
SinaMN75