0

私はを公開しています。私はこの仕事を成功裏に完了しています。ここでFirebaseRecyclerAdapterのpopulateViewHolder()は、特定の値を持つキーが完全に削除される前に呼び出され、nullpointerexceptionを返します。

は私のコードです:

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 

問題は、すぐに私は、データベースからuniqueKey1を削除するよう、populateViewHolder()メソッド内のコードがあることですuniqueKey1のデータが完全に削除されないため、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に表示しますか?

答えて

0

私は方法を考え出しました。

コードにいくつかの条件を追加しました。

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)); 

      } 
    } 

と今ではすべてが完璧に正常に動作します:

ここで更新されたコードです!

関連する問題