如何在 RecyclerView 的末尾添加一个按钮?
How to add a button at the end of RecyclerView?
我想在 RecyclerView 的末尾显示一个按钮。
ListView 有一个方法 addFooterView(),如何对 RecylerView 做同样的事情。
一种方法是让您的页脚视图成为适配器的 "ViewType"。
为此,将 getItemViewType 覆盖为 return 上一项的不同值。
@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
}
}
别忘了getCount()更新值return加1,并在OnBindViewHolder中区分2种ViewHolder(以instanceof为例)
我遇到了这个问题并找到了这个答案。当前选择的答案是正确的,但缺少一些细节。这是完整的实现,
将此方法添加到您的适配器
@Override
public int getItemViewType(int position) {
return (position == myItems.size()) ? R.layout.button : R.layout.item;
}
它将检查当前位置是否超过了列表中的最后一项,如果是则它将 return 按钮布局值传递给此方法,
@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);
}
上面的方法检查传入的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);
}
}
这会检查我们是否超过了列表中的最后一个 item
,如果超过了,那么它将 onClick
方法设置到我们的按钮。否则它会像平常一样创建一个 item
。
我们还需要将getItemCount
方法改成这个
@Override
public int getItemCount() {
return myItems.size() + 1;
}
由于我们要遍历所有 items
,然后在末尾添加一个 button
,因此 + 1
是我们的按钮。
然后最后我们需要将视图添加到 myViewHolder
class
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);
}
}
希望对您有所帮助!
有一个非常简单的方法
首先,您需要将 +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");
});
}
这就是我在 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
}
}
}
}
这是无需创建新视图布局即可为我工作的技巧。
基本上你必须比较数组的大小和视图持有者的位置以在 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
}
});
}
我想在 RecyclerView 的末尾显示一个按钮。
ListView 有一个方法 addFooterView(),如何对 RecylerView 做同样的事情。
一种方法是让您的页脚视图成为适配器的 "ViewType"。 为此,将 getItemViewType 覆盖为 return 上一项的不同值。
@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
}
}
别忘了getCount()更新值return加1,并在OnBindViewHolder中区分2种ViewHolder(以instanceof为例)
我遇到了这个问题并找到了这个答案。当前选择的答案是正确的,但缺少一些细节。这是完整的实现,
将此方法添加到您的适配器
@Override
public int getItemViewType(int position) {
return (position == myItems.size()) ? R.layout.button : R.layout.item;
}
它将检查当前位置是否超过了列表中的最后一项,如果是则它将 return 按钮布局值传递给此方法,
@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);
}
上面的方法检查传入的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);
}
}
这会检查我们是否超过了列表中的最后一个 item
,如果超过了,那么它将 onClick
方法设置到我们的按钮。否则它会像平常一样创建一个 item
。
我们还需要将getItemCount
方法改成这个
@Override
public int getItemCount() {
return myItems.size() + 1;
}
由于我们要遍历所有 items
,然后在末尾添加一个 button
,因此 + 1
是我们的按钮。
然后最后我们需要将视图添加到 myViewHolder
class
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);
}
}
希望对您有所帮助!
有一个非常简单的方法 首先,您需要将 +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");
});
}
这就是我在 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
}
}
}
}
这是无需创建新视图布局即可为我工作的技巧。
基本上你必须比较数组的大小和视图持有者的位置以在 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
}
});
}