【问题标题】:NullPointerException when using FirebaseUI and RecyclerView使用 FirebaseUI 和 RecyclerView 时出现 NullPointerException
【发布时间】:2020-06-01 10:31:00
【问题描述】:

我遵循了本指南How to display data from Firestore in a RecyclerView with Android?,但在 ViewHolder 的设置器中面临 NullPointerException。我实际上也很不确定在 ViewHolder 的 setter 中要做什么......

![数据库]https://imgur.com/a/wquZ08f

型号:

public class FoodModel {
    private String foodName;
    private String foodType;
    private String foodQty;
    private String foodExpDate;

    public FoodModel() {}

    public FoodModel(String name, String type, String qty, String expDate) {
        this.foodName = name;
        this.foodType = type;
        this.foodQty = qty;
        this.foodExpDate = expDate;
    }

    public String getFoodName() {return foodName;}
    public void setFoodName(String name) {foodName = name;}

    public String getFoodType() {return foodType;}
    public void setFoodType(String type) {foodType = type;}

    public String getFoodQty() {return foodQty;}
    public void setFoodQty(String qty) {foodQty = qty;}

    public String getFoodExpDate() {return foodExpDate;}
    public void setFoodExpDate(String expDate) {foodExpDate = expDate;}
}

活动代码:

recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        recyclerView.setHasFixedSize(true);

        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        Query foodQuery = db.collection("Food")
                .orderBy("food_name", Query.Direction.ASCENDING);

        FirestoreRecyclerOptions<FoodModel> options = new FirestoreRecyclerOptions.Builder<FoodModel>()
                .setQuery(foodQuery, FoodModel.class)
                .build();

        adapter = new FirestoreRecyclerAdapter<FoodModel, FoodViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull FoodViewHolder holder, int position, @NonNull FoodModel model) {
                holder.setFoodName(model.getFoodName());
            }
            @NonNull
            @Override
            public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup group, int viewType) {
                View view = LayoutInflater.from(group.getContext()).inflate(R.layout.recycler_view_row, group, false);
                return new FoodViewHolder(view);
            }
        };
        recyclerView.setAdapter(adapter);
    }
    private class FoodViewHolder extends RecyclerView.ViewHolder {
        private View view;

        FoodViewHolder(View itemView) {
            super(itemView);
            view = itemView;
        }

        void setFoodName(String foodName) {
            TextView textView = view.findViewById(R.id.editName);
            textView.setText(foodName);
        }
    }

recycler_view_row 的xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/foodListRow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.qremind, PID: 17735
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
        at com.example.qremind.FoodList$FoodViewHolder.setFoodName(FoodList.java:91)
        at com.example.qremind.FoodList$1.onBindViewHolder(FoodList.java:70)
        at com.example.qremind.FoodList$1.onBindViewHolder(FoodList.java:67)
        at com.firebase.ui.firestore.FirestoreRecyclerAdapter.onBindViewHolder(FirestoreRecyclerAdapter.java:158)
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
        at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
        at androidx.recyclerview.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1897)
        at androidx.recyclerview.widget.RecyclerView$1.run(RecyclerView.java:414)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:878)
        at android.view.Choreographer.doCallbacks(Choreographer.java:690)
        at android.view.Choreographer.doFrame(Choreographer.java:622)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:864)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:185)
        at android.app.ActivityThread.main(ActivityThread.java:6473)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:916)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:806)

【问题讨论】:

  • 请提供数据库结构
  • @Ashish 编辑了帖子!它在顶部。希望这就是我们所需要的!
  • 添加项目的xmlrecycler_view_row
  • @HasanBouTaam 添加了!

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


【解决方案1】:

您已经在函数内部定义了 Textview。将其定义为

private class FoodViewHolder extends RecyclerView.ViewHolder {
        private View view;
        TextView textView;
        FoodViewHolder(View itemView) {
            super(itemView);
            view = itemView;
            textView = view.findViewById(R.id.editName);
        }

        void setFoodName(String foodName) {

            textView.setText(foodName);
        }
    }

【讨论】:

  • 我已经尝试过了,但同样的错误仍然存​​在。 :(
【解决方案2】:

改变这个:

TextView textView = view.findViewById(R.id.editName);

进入这个:

TextView textView = view.findViewById(R.id.foodListRow);

【讨论】:

    【解决方案3】:

    FoodViewHolder 类中:

    这个方法:

        void setFoodName(String foodName) {
             //here is your problem
            TextView textView = view.findViewById(R.id.editName);
            textView.setText(foodName);
        }
    

    一定是这样的,你指错了ID:

        void setFoodName(String foodName) {
    
            TextView textView = view.findViewById(R.id.foodListRow);
            textView.setText(foodName);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 2013-12-29
      • 2013-12-19
      相关资源
      最近更新 更多