如何在RecyclerView Adapter中添加固定按钮?

5

nav_draw_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true">

  <TextView
    android:id="@+id/title"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="30dp"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:textSize="15dp"
    android:textStyle="bold"
    android:focusable="true"
    android:outlineProvider="bounds" />
</RelativeLayout>

现在我想在 nav_draw_row 的末尾添加一个固定的 Button,但是每当我在上面的代码中添加按钮,紧接着 TextView 后面时,它会显示为以下方式:enter image description here 我知道这是为什么,但无法找到解决方案,使得 Button 固定在 Bar 的末尾。这是我的 Adapter 代码:
public class NavigationDrawerAdapter extends RecyclerView.Adapter<NavigationDrawerAdapter.MyViewHolder> {

List<NavDrawerItem> data = Collections.emptyList();
private LayoutInflater inflater;
private Context context;

    public NavigationDrawerAdapter(Context context, List<NavDrawerItem> data) {
        this.context = context;
        inflater = LayoutInflater.from(context);
        this.data = data;
    }

    public void delete(int position) {
        data.remove(position);
        notifyItemRemoved(position);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.nav_drawer_row, parent, false);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        NavDrawerItem current = data.get(position);
        holder.title.setText(current.getTitle());
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView title;

        public MyViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.title);
        }
    }
   }

如何解决这个问题?
2个回答

2

在RecyclerView中添加“加载更多”按钮。

首先需要创建一个包含按钮的布局,并修改您的视图持有者以获取按钮ID:

然后,一种简单的方法是将getItemCount()加1并添加一个标志(如布尔值)来判断是否需要绘制按钮。

带有标志的新getItemCount()将如下所示:

private boolean hasLoadButton = true;

public boolean isHasLoadButton() {
    return hasLoadButton;
}

public void setHasLoadButton(boolean hasLoadButton) {
    this.hasLoadButton = hasLoadButton;
    notifyDataSetChanged();
}

@Override
public int getItemCount() {
    if (hasLoadButton) {
        return data.size() + 1;
    } else {
        return data.size();
    }
}

接下来你需要在适配器中重写获取视图类型的方法:

private final int TITLE = 0;
private final int LOAD_MORE = 1;
@Override                                 
public int getItemViewType(int position) {
    if (position < getItemCount()) {     
        return TITLE;                         
    } else {                              
        return LOAD_MORE;                         
    }                                     
}  

如果位置在0和data.size()-1之间,则会为标题创建一个typeView,否则为加载更多按钮创建一个typeView。
现在我们需要创建视图持有者:
在方法onCreateViewHolder(ViewGroup parent, int viewType)中。
@Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TITLE) {
            return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.nav_draw_row, parent, false));
        } else if (view type == LOAD_MORE) {
            return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.load_more_row, parent, false));
        } else {
            return null;
        }
    }

load_more_row

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <Button
        android:id="@+id/load_more"
        android:text="load more !"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>

不要忘记修改您的viewholder以包含新按钮。
最后是onBindViewHolder方法:
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    if(position >= getItemCount()) {
        holder.loadMore....
    } else {
    NavDrawerItem current = data.get(position);
    holder.title.setText(current.getTitle());
    }
}

谢谢您的回答,但是我在我的布局中有一个“TextView”,但是我在这里看不到它。 - user5063816
文本视图是否位于回收视图上方? - xiaomi
我不太理解你的布局(一行中包含什么,回收视图之外有什么),当你说“使按钮固定在栏的末尾”时,你是什么意思? - xiaomi
如果我运行上述布局,它将显示一个字符串列表,例如: 我的清单 会员福利 你的清单 ....我想在列表末尾添加按钮。 - user5063816
一个例子可以是Recycler-view显示10个列表,而且应该有一个“加载更多”的按钮来加载下一个10个列表。 - user5063816
显示剩余2条评论

0

您可以创建一个扩展了Recycler View类的自定义视图 创建线性布局 添加按钮和Recycler View 为新视图创建类 在XML中使用您的新自定义视图 并将监听器添加到按钮上 就这样 希望这能帮助您有一个想法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接