在具有特定值的键被完全删除之前调用 FirebaseRecyclerAdapter 的 populateViewHolder() 从而给出 nullpointerexception

FirebaseRecyclerAdapter's populateViewHolder() getting called before a key having certain values gets fully removed thus giving nullpointerexception

我在我的应用程序中使用 FirebaseUIFirebaseRecyclerAdapter 从 FirebaseDatabase 引用中获取一些数据并将其显示在 RecyclerView 中。我正在成功完成这项任务。

这是我的代码:

private void attachRecyclerViewAdapter() {
        Query lastFifty = mDatabase.child(rID).limitToFirst(50);
        mRecyclerViewAdapter = new FirebaseRecyclerAdapter<AModelClass, AModelClass.ViewHolder>(
                AModelClass.class, R.layout.a_player_layout, APlayersModelClass.ViewHolder.class, lastFifty) {

            @Override
            protected void populateViewHolder(AModelClass.ViewHolder viewHolder, AsModelClass model, int position) {

                String key = this.getRef(position).getKey();
                aReference.child(requestID).child(key).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.getValue() != null) {

                            Map<String, String> map = (Map<String, String>) dataSnapshot.getValue();
                            pA = map.get("pName");
                            uA = map.get("pUrl"); 
                            // error on line below
                            String cLatS = map.get("cLat").trim();
                            currentLtAU = Double.parseDouble(cLatS);
                            String cLngS = map.get("cLng").trim();
                            currentLnAU = Double.parseDouble(cLngS);

                            viewHolder.setPName(pA);
                            viewHolder.setPUrl(uA);
                            viewHolder.setCurrentLatAU(String.valueOf(currentLtAU));
                            viewHolder.setCurrentLngAU(String.valueOf(currentLnAU));

                        } else {
                            Snackbar snackbar = Snackbar
                                    .make(coordinatorLayout, "Some error occurred. Please retry!", Snackbar.LENGTH_SHORT);
                            snackbar.show();
                            onBackPressed();
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

            }
        };

        aList.setAdapter(mRecyclerViewAdapter);
    }

这是数据库结构的表示:

-app
  -requestID
    -uniqueKey1
      -key: value
      -key: value
      -cLat: value
    -uniqueKey2
      -key: value
      -key: value
      -cLat: value

问题是,一旦我从数据库中删除 uniqueKey1populateViewHolder() 方法中的代码就会被调用,[= =15=] 没有被完全删除,因此 aReference.child(requestID).child(key) 再次获取 uniqueKey1 但这次一些数据,特别是 cLat 从这里删除,因此应用程序崩溃给出 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.trim()' on a null object reference 代码中指定的行出错。

我想要知道的是如何让 populateViewHolder() 中的代码仅在 uniqueKey1 及其下的数据被调用时调用完全删除,然后 aReference.child(requestID).child(key) 仅将 uniqueKey2(剩余键)作为参数再次加载数据并显示在 recyclerview?

嗯,我想我想出了一个办法。

只是在代码中放置了一些条件。

这是更新后的代码:

    if (dataSnapshot.getValue() != null) {

         if (dataSnapshot.hasChild("pName") && dataSnapshot.hasChild("pUrl") && dataSnapshot.hasChild("cLat") && dataSnapshot.hasChild("cLng")) {

                 Map<String, String> map = (Map<String, String>) dataSnapshot.getValue();
                 pA = map.get("pName");
                 uA = map.get("pUrl");
                 String cLatS = map.get("cLat").trim();
                 currentLtAU = Double.parseDouble(cLatS);
                 String cLngS = map.get("cLng").trim();
                 currentLnAU = Double.parseDouble(cLngS);

                 viewHolder.setPName(pA);
                 viewHolder.setPUrl(uA);
                 viewHolder.setCurrentLatAU(String.valueOf(currentLtAU));
                 viewHolder.setCurrentLngAU(String.valueOf(currentLnAU));

          }
     }

现在一切正常!