【问题标题】:I am getting a nullpointer for my RecyclerView Possibly because of my context我正在为我的 RecyclerView 获得一个空指针,可能是因为我的上下文
【发布时间】:2021-06-03 22:35:34
【问题描述】:

我正在我的 RecyclerViewAdapter 中编写此代码,并且我有一个单独的 Java 文件,我想从中为我的适配器类设置 ItemOnClickListener 和 Context。但是,它们显示为空。这是 Java 文件中用于 recyclerView 的方法。

public void update(){
        userRef.get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                        String imageUrl;
                        String name;
                        String extra;
                        String ready;
                        String ingredients;
                        String id;
                        List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments();
                        for( int i = 0; i < list.size(); i++){
                            DocumentSnapshot documentSnapshot = list.get(i);
                            if(documentSnapshot.exists()){
                                Map<String, Object> favFood = documentSnapshot.getData();
                                name = favFood.get(KEY_NAME).toString();
                                imageUrl = favFood.get(KEY_URL).toString();
                                extra = favFood.get(KEY_XTRAINFO).toString();
                                ready = favFood.get(KEY_READY).toString();
                                Log.d("TAGG", ready);
                                ingredients = favFood.get(KEY_INGREDIENTS).toString();
                                id = favFood.get(KEY_ID).toString();
                                allFavoritedFoods.add(new FoodItem(imageUrl, name, ready, extra, ingredients, id, FirebaseAuth.getInstance().getCurrentUser().getUid()));
                            }
                        }
                        foodAdapter = new FoodAdapter(allFavoritedFoods, FavItem.this);
                        recyclerView.setAdapter(foodAdapter);
                        foodAdapter.setOnItemClickListener(FavItem.this);


                    }
                }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {

            }
        });
    }

这是来自适配器类的相关代码:

public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.ViewHolder> {
    private ArrayList<FoodItem> foodItems;
    private Context context;
    static String id;
    private OnItemClickListener mListener;


    public interface OnItemClickListener{
        void onItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener){
        mListener = listener;
    }
    @Override
    public int getItemCount() {
        return foodItems.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        public TextView name, readyTime, ingredients, extraInfo;
        public ImageView picture;
        Button favBtn;


        FirebaseFirestore db = FirebaseFirestore.getInstance();
        public static final String KEY_URL = "imageUrl", KEY_INGREDIENTS = "ingredients", KEY_READY = "ready";
        public static final String KEY_NAME = "name";
        public static final String KEY_XTRAINFO = "info";
        public static final String KEY_ID = "id";
        public static final String KEY_FAV = "favorited";

        //public Button favBtn;
        public ViewHolder(View itemView){
            super(itemView);
            name = itemView.findViewById(R.id.title);
            picture = itemView.findViewById(R.id.thumbnail);
            readyTime = itemView.findViewById(R.id.readyInMinutes);
            ingredients = itemView.findViewById(R.id.ingredients);
            extraInfo = itemView.findViewById(R.id.extraInfo);

            itemView.setOnClickListener(new View.OnClickListener(){

                @Override
                public void onClick(View v) {
                    if(mListener!=null){
                        int position = getAdapterPosition();
                        if(position != RecyclerView.NO_POSITION){
                            mListener.onItemClick(position);
                        }
                    }
                }
            });
            favBtn = itemView.findViewById(R.id.favBtn);

            favBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    FoodItem foodItem = foodItems.get(position);
                    Map<String, Object> favFood = new HashMap<>();
                    favFood.put(KEY_NAME, foodItem.getTitle());
                    favFood.put(KEY_URL, foodItem.getImageUrl());
                    favFood.put(KEY_ID, foodItem.getId());
                    favFood.put(KEY_INGREDIENTS, foodItem.getIngredients());
                    favFood.put(KEY_READY, foodItem.getReadyTime());
                    favFood.put(KEY_XTRAINFO, foodItem.getExtraInfo());




                    db.collection(FirebaseAuth.getInstance().getCurrentUser().getEmail()).document(id+"").set(favFood)
                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                    Toast.makeText(itemView.getContext(), "Added to Favorites", Toast.LENGTH_SHORT);
                                }
                            })
                            .addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Toast.makeText(itemView.getContext(), "Deleted From Favorites", Toast.LENGTH_SHORT);
                                    Log.d("Error in Storing", e.toString());
                                }
                            });
                }
            });
        }
    }
    public FoodAdapter(ArrayList<FoodItem> foodItems, Context context){
        this.foodItems = foodItems;
        this.context = context;
    }

对于 MainActivity.java,这有效,但是 foodAdapter.setOnItemClickListener(MainActivity.this);。但它的工作方式与其他 Java 文件不同。 对于上下文,我会为其他 Java 文件中的方法放置什么以及为 onItemClickListener 放置什么?

【问题讨论】:

  • 错误行在哪里?
  • 这个:foodAdapter = new FoodAdapter(allFavoritedFoods, FavItem.this);问题出在 FavItem.this 上。
  • 为什么其他setOnClickListener不使用mListener?
  • 我不确定你指的是哪一个。
  • 你不需要为mListener传入一个Activity吗?

标签: android google-cloud-firestore android-recyclerview


【解决方案1】:

如果您在片段中编写update() 方法,请按如下方式传递上下文。

foodAdapter = new FoodAdapter(allFavoritedFoods, getActivity());

如果你在一个activity中编写update()方法,传递上下文如下。(假设activity名称是MainActivity)

foodAdapter = new FoodAdapter(allFavoritedFoods, MainActivity.this);

【讨论】:

  • 好的,谢谢。我应该如何处理 foodAdapter.setOnItemClickListener?
  • 在片段或活动中实现它,当您点击recyclerview中的项目时,将调用onItemClick
猜你喜欢
  • 2014-12-29
  • 2011-12-13
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多