2016-12-12 6 views
0

次の問題が発生しました。私がFirebaseRecyclerAdapterから値を取得しようとしたとき、私はnullを取得しました。 は私のコードを確認してください:FirebaseRecyclerAdapter get null値

public abstract class TabFragmentLists extends Fragment { 

    private DatabaseReference mDatabase; 

    private FirebaseRecyclerAdapter<Post, PostViewHolder> mAdapter; 
    private RecyclerView mRecycler; 
    private LinearLayoutManager mManager; 

    public TabFragmentLists() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView (LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     View rootView = inflater.inflate(R.layout.fragment_tab_lists, container, false); 

     mDatabase = FirebaseDatabase.getInstance().getReference(); 
     mRecycler = (RecyclerView) rootView.findViewById(R.id.messages_list); 
     mRecycler.setHasFixedSize(true); 

     return rootView; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     // Set up Layout Manager, reverse layout 
     mManager = new LinearLayoutManager(getActivity()); 
     mManager.setReverseLayout(true); 
     //mManager.setStackFromEnd(true); 

     mRecycler.setLayoutManager(mManager); 

     // Set up FirebaseRecyclerAdapter with the Query 
     Query postsQuery = getQuery(mDatabase); 
     mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(Post.class, R.layout.item_post, 
       PostViewHolder.class, postsQuery) { 
      @Override 
      protected void populateViewHolder(final PostViewHolder viewHolder, final Post model, final int position) { 
       final DatabaseReference postRef = getRef(position); 

       // Set click listener for the whole post view 
       final String postKey = postRef.getKey(); 

       viewHolder.bindToPost(model, new View.OnClickListener() { 
        @Override 
        public void onClick(View postView) { 
         Log.e("OnClick","== Bind==="); 
        } 
       }); 
      } 
     }; 

     mRecycler.setAdapter(mAdapter); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mAdapter != null) { 
      mAdapter.cleanup(); 
     } 
    } 

    public String getUid() { 
     return FirebaseAuth.getInstance().getCurrentUser().getUid(); 
    } 

    public abstract Query getQuery(DatabaseReference databaseReference); 
} 

PostViewHolder

public class PostViewHolder extends RecyclerView.ViewHolder { 

    public TextView messsageView; 
    public PostViewHolder(View itemView) { 
     super(itemView); 

     messsageView = (TextView) itemView.findViewById(R.id.post_message); 
    } 

    public void bindToPost(Post post, View.OnClickListener starClickListener) { 
     //null and crash 
     Log.e("Post", String.valueOf(post.getMessage())); 
     messsageView.setText(post.getMessage()); 
    } 
} 

Postクラス

@IgnoreExtraProperties 
public class Post { 

    public String message; 
    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 


    public Post() { 
     // Default constructor required for calls to DataSnapshot.getValue(Post.class) 
    } 

    public Post(String message) { 
     this.message = message; 
    } 

    @Exclude 
    public Map<String, Object> toMap() { 
     HashMap<String, Object> result = new HashMap<>(); 
     result.put(PostKeys.kMessage.toString(), message); 
     return result; 
    } 

} 

そしてここでは、DBの構造 enter image description here

は任意のヒントをお願い申し上げます。おかげ

EDIT

public class TabFragmentPosts extends TabFragmentLists { 

    public TabFragmentPosts() { 
     // Required empty public constructor 
    } 

    @Override 
    public Query getQuery(DatabaseReference databaseReference) { 
     // All my posts 
     return databaseReference.child("post"); 
    } 

} 

この私が最終的にあなたがそれのための権限を有効にしたか否かの権限を有効にしない場合は

E/LIST dataSnapshot: DataSnapshot { key = -KOgO2hC9Fh_vhe1kh1z, value = null } 

答えて

0

まず...、セキュリティルールを確認する必要があり、まさに.. 。下のリンクでアクセス許可を設定する方法を見つける... https://firebase.google.com/docs/database/security/quickstart

+0

OK]をクリックして感謝 – Svitlana

+0

はい、私はすでにこの権限{ "ルール" がチェックされます: "= AUTHヌル!" } :{ ".read ": "!AUTH =ヌル"、 " .WRITEを" } – Svitlana

0

あなたのコードを誤読していない限り、あなたはあなたのDatabaseReferenceを間違って設定したようです現在、あなたのベースとなっているFirebaseリファレンスを指し示していますが、それをあなたの「ポスト」パスに向ける必要があります。

mchatabaseプロパティに.child( "post")を追加する必要があります。

+0

私はこのクラスをTabFragmentPostsに持っています、お寄せいただきありがとうございます。編集済み – Svitlana

0

最後に、問題を発見した クラスのポストは、(アカウント大文字/小文字を考慮)正確助けようとしたすべての人へ

@IgnoreExtraProperties 

public class Post { 

    public String Message; // HERE IS THE PROBLEM WAS 

    public Post() { 
     // Default constructor required for calls to DataSnapshot.getValue(Post.class) 
    } 

    public Post(String Message) { 
     this.Message = Message; 
    } 

    @Exclude 
    public Map<String, Object> toMap() { 
     HashMap<String, Object> result = new HashMap<>(); 
     result.put("Message", Message); 
     return result; 
    } 
} 

おかげで、変数の同じ名前を持つ必要があります!感謝します!

+1

Firebaseアノテーションhttps://firebase.google.com/docs/reference/android/com/google/firebase/database/PropertyNameを使用して、Firebaseのプロパティと一致するように変数名を変更する必要はありません –

+1

すごく感謝します! – Svitlana