如何在RecyclerView结束时添加按钮?

时间:2015-03-17 18:00:51

标签: android android-recyclerview

我想在RecyclerView的末尾显示一个按钮。

使用ListView有一个方法addFooterView(),如何对RecylerView做同样的事情。

5 个答案:

答案 0 :(得分:36)

一种方法是让你的页脚查看" ViewType"您的适配器。 为此,请覆盖getItemViewType以返回上一个项目的不同值。

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

然后在onCreateViewHolder中处理不同的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
    }
}

不要忘记通过添加1来更新getCount()的返回值,并区分OnBindViewHolder中的两种类型的ViewHolder(例如,使用instanceof)。

答案 1 :(得分:32)

我遇到了这个问题并找到了答案。当前选择的答案是正确的,但缺少一些细节。这是完整的实现,

将此方法添加到适配器

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

它将检查当前位置是否超过列表中的最后一项,如果是,那么它将按钮布局值返回到此方法,

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

上述方法检查传递的viewTypeitem布局还是button布局,然后将视图膨胀并将膨胀的视图发送到此方法,

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

这会检查我们是否超过了列表中的最后一个item,如果是,那么它会将onClick方法设置为我们的按钮。否则它会像正常一样创建item

我们还需要将getItemCount方法更改为此

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

由于我们正在浏览所有items,然后在最后添加button,因此+ 1是我们的按钮。

然后我们需要将我们的视图添加到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);
    }
}

我希望这有帮助!

答案 2 :(得分:0)

有一个非常简单的方法 首先,您需要为列表的大小添加+1

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

然后检查列表的位置是否比列表的大小要大。就我而言:

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

答案 3 :(得分:0)

这就是我在Kotlin中使用的东西。希望对别人有帮助。

test_folder
    pages_folder
        another.php
        header.php
    index.php

答案 4 :(得分:0)

这是对我有用的技巧,无需创建新的视图布局。 基本上,您必须比较数组的大小和视图持有者的位置,才能在onBindViewHolder中生成新视图。
编写以下代码:

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