【问题标题】:How to add fixed Button in RecyclerView Adapter?如何在 RecyclerView 适配器中添加固定按钮?
【发布时间】:2015-12-04 17:16:02
【问题描述】:

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 之后。它以以下方式显示:

我知道为什么会发生这种情况,但无法找到解决方案以在 Bar 末尾修复 Button。这是我的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);
        }
    }
   }

如何解决这个问题?

【问题讨论】:

    标签: android android-layout android-listview android-recyclerview android-adapterview


    【解决方案1】:

    在回收站视图中构建一个加载更多按钮。

    首先要做的是用你的按钮创建一个布局并修改你的viewhold来获取按钮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>
    

    不要忘记更改您的视图以包含新按钮。

    最后是 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,我在这里看不到
    • 文本视图是否位于回收站视图上方?
    • 我也粘贴了我的布局文件和代码。可以看下Adapter代码中的onBindViewHolder 方法
    • 我不太明白你的布局(行内是什么,回收站视图外是什么),当你说“在 Bar 末尾修复 Button”时,你是什么意思?
    • 如果我运行上面的布局,那么它将显示一个字符串列表,即My listingMember Benefitsyour Listing ....我想在列表末尾添加什么按钮。跨度>
    【解决方案2】:

    您可以创建自定义视图来扩展回收器视图类 创建线性布局 添加一个按钮和一个回收站视图 为新视图创建类 在 XML 中使用新的自定义视图 并将侦听器添加到按钮 就是这样 希望对你有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 2017-10-15
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      相关资源
      最近更新 更多