Comment ajouter un bouton à la fin de RecyclerView?

je veux afficher un bouton à la fin de RecyclerView.

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

19
demandé sur Vrutin Rathod 2015-03-17 21:00:50

3 réponses

Une façon de le faire serait de prendre votre pied de page de vue d'un "ViewType" de votre adaptateur. Pour ce faire, remplace getItemViewType pour renvoyer une valeur différente pour votre dernier article.

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

puis dans le porteurcontreateview, manipulez le type de vue différent.

@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 le retour de valeur par getCount() en ajoutant 1, et de distinguer les 2 types de Visualiseur dans OnBindViewHolder (avec instanceof par exemple).

30
répondu Gyome 2015-03-17 18:38:21

je suis tombé sur ce problème et trouvé cette réponse. La réponse actuellement choisie est correcte, mais il manque quelques détails. Voici la mise en œuvre complète,

Ajouter cette méthode à votre carte

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

il vérifiera si la position actuelle est au-delà du dernier élément de votre liste, s'il l'est, il retournera la valeur du bouton layout à 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 le passé viewType est le item mise en page ou la button layout et ensuite gonfle la vue occordément 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);
    }
}

Ceci permet de vérifier si nous sommes passés de la dernière item dans la liste et si nous sommes alors il définit le onClick méthode à notre bouton. Sinon, il crée un item comme d'habitude.

nous devons aussi changer le getItemCount méthode

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

puisque nous traversons tous les items et ensuite ajouter un button à la fin, le + 1 est notre bouton.

enfin nous devons ajouter notre vue à la myViewHolder classe

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 cela aide!

28
répondu Gary Holiday 2016-08-01 05:31:05

Il y a un moyen très simple pour que vous devez d'abord 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 large que la taille de la liste faire 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
répondu SinaMN75 2018-08-29 11:05:52