android - 为什么这个 onClickListener 会给出 NullPointerException?
问题描述
活动中
borderFav = (Button) findViewById(R.id.borderFav);
fav = (Button) findViewById(R.id.fav);
borderFav.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
borderFav.setVisibility(View.GONE);
fav.setVisibility(View.VISIBLE);
}
});
fav.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fav.setVisibility(View.GONE);
borderFav.setVisibility(View.VISIBLE);
}
});
在 RecyclerView 项目的 XML 中
<Button
android:id="@+id/borderFav"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="10"
android:layout_gravity="center"
android:background="@drawable/favorite_border_24"
android:visibility="visible"
/>
<Button
android:id="@+id/fav"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="10"
android:layout_gravity="center"
android:background="@drawable/favorite_24"
android:visibility="gone"
/>
逻辑很简单,空心被点击,变成满心,满心点击变成空心,但是Logcat在活动中给出了一个NullPointer。
如果我删除这两个的 onClickListeners,则没有错误。
RecyclerView 适配器代码
public class AllAdapter extends RecyclerView.Adapter<AllAdapter.ViewHolder> {
private ArrayList<Food> data;
private OnItemListener onItemListener;
public ArrayList<Food> getData() {
return data;
}
public AllAdapter(ArrayList<Food> data, OnItemListener onItemListener) {
this.data = data;
this.onItemListener = onItemListener;
}
@NonNull
@Override
public AllAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new ViewHolder(v, onItemListener);
}
@Override
public void onBindViewHolder(@NonNull AllAdapter.ViewHolder holder, final int position) {
holder.textView.setText(this.data.get(position).getName());
}
@Override
public int getItemCount() {
return data.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
private TextView textView;
private OnItemListener onItemListener;
public ViewHolder(@NonNull View itemView, OnItemListener onItemListener) {
super(itemView);
this.textView = itemView.findViewById(R.id.tv);
this.onItemListener = onItemListener;
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
onItemListener.onClick(getAdapterPosition());
}
}
public void filterList(ArrayList<Food> filteredList){
data = filteredList;
notifyDataSetChanged();
}
public interface OnItemListener{
void onClick(int position);
}
}
我没有触摸适配器来实现收藏按钮。
解决方案
从您粘贴的代码看来,您做错了,recyclerview 的 xml 项属于 recyclerview 适配器,因此您应该将这些单击侦听器放在onBindViewHolder () 中,而不是在活动中。
推荐阅读
- python - 在 Windows 10 中将 Sybase 与 Python 连接起来
- r - 使用条件操作矩阵并连接结果
- python - sql.Identifier 不带引号
- c - 我想在使用写入功能时显示整数
- macos - 如何在终端中使用 IntelliJ 捆绑的 maven?
- android - 我有两个单选按钮,其中要执行单选。但是在单行上,两个单选按钮都被选中
- javascript - 防止 Next.js 生成某些路径文件
- ios - 使用 Apple ID 登录时显示无效的 responseType
- javascript - 如何从ajax布尔值中选择值
- amazon-ec2 - 在 aws 中没有 http 时,路由 53 域无法工作