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

Vru*_*hod 28 android android-recyclerview

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

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

Gyo*_*ome 38

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

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

然后在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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 难道不应该是 return (position == mData.size() -1) 吗?VIEW_TYPE_FOOTER : VIEW_TYPE_CELL; (3认同)

Gar*_*day 36

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

将此方法添加到适配器

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

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

@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);
}
Run Code Online (Sandbox Code Playgroud)

上面的方法检查传递的viewType是item布局还是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

@Override
public int getItemCount() {
    return myItems.size() + 1;
}
Run Code Online (Sandbox Code Playgroud)

既然我们正在经历所有的事情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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!

  • 这真的帮助了我@Gary (2认同)

Nux*_*Nux 5

这就是我在 kotlin 中使用的。希望它可以帮助某人。

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

}
Run Code Online (Sandbox Code Playgroud)