如何在 RecyclerView Adapter 中添加固定按钮?
How to add fixed Button in RecyclerView Adapter?
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);
}
}
}
如何解决这个问题?
将加载更多按钮构建到回收站视图中。
首先要做的是用你的按钮创建一个布局并修改你的视点以获得按钮 id:
然后制作按钮的一个简单方法是将 +1 添加到 getItemCount() 和一个标志(即布尔值)以了解是否需要绘制按钮。
带有标志的新 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 之间,您将有一个标题类型视图,否则为加载更多按钮的类型视图。
现在我们必须创建视图持有者:
方法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());
}
}
您可以创建一个扩展回收器视图的自定义视图class
创建线性布局
添加一个按钮和一个回收器视图
为新视图创建 class
在 XML 中使用您的新自定义视图
并将侦听器添加到按钮
就是这样
希望对您有所帮助
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);
}
}
}
如何解决这个问题?
将加载更多按钮构建到回收站视图中。
首先要做的是用你的按钮创建一个布局并修改你的视点以获得按钮 id:
然后制作按钮的一个简单方法是将 +1 添加到 getItemCount() 和一个标志(即布尔值)以了解是否需要绘制按钮。
带有标志的新 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 之间,您将有一个标题类型视图,否则为加载更多按钮的类型视图。
现在我们必须创建视图持有者:
方法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());
}
}
您可以创建一个扩展回收器视图的自定义视图class 创建线性布局 添加一个按钮和一个回收器视图 为新视图创建 class 在 XML 中使用您的新自定义视图 并将侦听器添加到按钮 就是这样 希望对您有所帮助