首页 > 解决方案 > 为什么这个 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);
    }

}

我没有触摸适配器来实现收藏按钮。

标签: androidandroid-studio

解决方案


从您粘贴的代码看来,您做错了,recyclerview 的 xml 项属于 recyclerview 适配器,因此您应该将这些单击侦听器放在onBindViewHolder () 中,而不是在活动中。


推荐阅读