2016-12-12 20 views
0

Я столкнулся со следующей проблемой. Когда я попытался получить значение из FirebaseRecyclerAdapter, я получаю null, только ключ, который я могу видеть. Пожалуйста, ознакомьтесь с мой код:FirebaseRecyclerAdapter получает нулевое значение

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

Сообщение класса

@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; 
    } 

} 

А вот структура БД 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

да, у меня уже есть эти разрешения { "правила": { ".read ": "AUTH = нуль", " .WRITE": "! AUTH = нуль" } } – Svitlana

0

Если я неправильно прочитал ваш код, похоже, что вы неправильно настроили DatabaseReference - вы 'в настоящее время просто указывая его на базовую ссылку Firebase, но вам нужно направить ее на ваш путь post.

Вам нужно добавить .child ("post") в свойство mDatabase.

+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

wow большое спасибо! – Svitlana

 Смежные вопросы

  • Нет связанных вопросов^_^