webentwicklung-frage-antwort-db.com.de

Wie füge ich eine Schaltfläche am Ende von RecyclerView hinzu?

Ich möchte am Ende von RecyclerView eine Schaltfläche anzeigen.

Mit ListView gab es eine Methode addFooterView (), wie man dies mit RecylerView macht.

21
Vrutin Rathod

Eine Möglichkeit wäre, Ihre Fußzeile zu einem "ViewType" Ihres Adapters zu machen. Um dies zu tun, überschreibt getItemViewType den anderen Wert für Ihr letztes Element.

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

Behandeln Sie dann im onCreateViewHolder den anderen 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
    }
}

Vergessen Sie nicht, den Wert return von getCount () durch Hinzufügen von 1 zu aktualisieren und die zwei Arten von ViewHolder in OnBindViewHolder (mit Instanz von beispielsweise) zu unterscheiden.

33
Gyome

Ich bin auf dieses Problem gestoßen und habe diese Antwort gefunden. Die aktuell ausgewählte Antwort ist korrekt, es fehlen jedoch einige Details. Hier ist die vollständige Implementierung,

Fügen Sie diese Methode Ihrem Adapter hinzu

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

Es wird geprüft, ob die aktuelle Position hinter dem letzten Element in Ihrer Liste liegt. Wenn dies der Fall ist, wird der Layoutwert für die Schaltfläche an diese Methode zurückgegeben.

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

Die obige Methode prüft, ob die übergebene Variable viewType das Layout item oder button ist, und bläst dann die Ansicht gelegentlich auf.

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

Dies prüft, ob wir die letzte item in der Liste hinter uns haben und wenn dies der Fall ist, wird die onClick-Methode auf unsere Schaltfläche gesetzt. Ansonsten erstellt es eine item wie normal.

Dazu müssen wir auch die getItemCount-Methode ändern

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

Da wir alle items durchgehen und am Ende eine button hinzufügen, ist der + 1 unsere Schaltfläche.

Schließlich müssen wir unsere Sicht zur myViewHolder-Klasse hinzufügen

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

Ich hoffe das hilft!

31
Gary Holiday

Hier ist der Trick, der für mich funktioniert, ohne ein neues Ansichtslayout zu erstellen. Grundsätzlich müssen Sie die Größe des Arrays und die Position des Ansichtshalters vergleichen, um eine neue Ansicht in onBindViewHolder zu erstellen.
Schreiben Sie den folgenden Code:

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    //This is necessary even if you mention view gone in xml file.
    holder.mAddBtn.setVisibility(View.GONE);
    //Compare size and add button at buttom of view,ie arraylist size
    if(position==mComplaintList.size()-1){
        holder.mAddBtn.setVisibility(View.VISIBLE);
    }
    holder.mAddBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        //Write code
        }
    });
}
0
kontashi35

Es gibt einen sehr einfachen Weg dazu. Zuerst müssen Sie der Größe der Liste +1 hinzufügen

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

prüfen Sie dann, ob die Position der Liste größer ist als die Größe der Liste. in meinem Fall:

        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

Dies ist, was ich in Kotlin verwende. Hoffe es hilft jemandem.

class ThumbnailsAdapter(
        private val mContext: Context,
        private val list: ArrayList<Image>
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return when (viewType) {
            R.layout.z_thumbnail -> {
                val view = LayoutInflater.from(mContext)
                        .inflate(R.layout.z_thumbnail, parent, false)
                ThumbnailViewHolder(view)
            }
            R.layout.z_thumbanail_add -> {
                val view = LayoutInflater.from(mContext)
                        .inflate(R.layout.z_thumbanail_add, parent, false)
                PlaceholderViewHolder(view)
            }
            else -> throw IllegalArgumentException("unknown view type $viewType")
        }
    }

    override fun getItemCount(): Int {
        return list.size + 1
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (getItemViewType(position)) {
            R.layout.z_thumbnail -> (holder as ThumbnailViewHolder).bind(list[position].path)
            R.layout.z_thumbanail_add -> (holder as PlaceholderViewHolder).bind()
        }
    }

    override fun getItemViewType(position: Int): Int {
        return when (position) {
            list.size -> R.layout.z_thumbanail_add
            else -> R.layout.z_thumbnail
        }
    }

    inner class ThumbnailViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val imageView = itemView.findViewById<ImageView>(R.id.thumbnail)

        fun bind(path: String) {
            Glide.with(mContext).load(path).into(imageView)
        }
    }

    inner class PlaceholderViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val btn = itemView.findViewById<ImageView>(R.id.add_images_btn)

        fun bind() {
            btn.setOnClickListener {
                //Do your logic here for the button
            }
        }
    }

}
0
Nux