Firebase检索数据

时间:2017-08-22 05:00:54

标签: android firebase firebase-realtime-database firebaseui

我试图在Firebase Recyclerview中显示我的Firebase数据库中的数据,这是我的数据库

enter image description here

我尝试使用与

中的教程代码相同的内容

Firebase UI

我试着得到这个结果 enter image description here

我对Android和编程都很新,所以任何帮助都会受到赞赏。这是相关的代码。

PostlistFragment

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

    final Dialog mDialog = new Dialog(mActivity, R.style.NewDialog);
    mDialog.addContentView(
            new ProgressBar(mActivity),
            new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
    );
    mDialog.setCancelable(true);
    mDialog.show();

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

    // Set up FirebaseRecyclerAdapter with the Query
    Query postsQuery = getQuery(mDatabase);
    mAdapter = new FirebaseRecyclerAdapter<PostMainboard, MainboardViewHolder>(PostMainboard.class, R.layout.mainboard_list, MainboardViewHolder.class, postsQuery) {
        @Override
        public void onDataChanged() {
            super.onDataChanged();
            mDialog.dismiss();
        }

        @Override
        protected void populateViewHolder(final MainboardViewHolder viewHolder, final PostMainboard model, final int position) {
            final DatabaseReference postRef = getRef(position);


            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(mActivity, MainboardDetailActivity.class);
                    intent.putExtra(MainboardDetailActivity.EXTRA_POST_KEY, postRef.getKey());
                    startActivity(intent);
                }
            });
        }
    };
    mRecycler.setAdapter(mAdapter);
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mAdapter != null) {
        mAdapter.cleanup();
    }
}
public abstract Query getQuery(DatabaseReference databaseReference);

我的细节活动的结果同样没有显示每一个

enter image description here

此处是我的详细活动代码

   @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view_mainboard_detail);

    mBodyView = (TextView)findViewById(R.id.post_detail);
    mAuthorView = (TextView)findViewById(R.id.txt_author);
    mTitleView = (TextView)findViewById(R.id.post_topic);
    mDateView = (TextView)findViewById(R.id.post_date_time);
    mCommentsRecycler = (RecyclerView) findViewById(R.id.recycler_comments);
    mCommentsRecycler.setLayoutManager(new LinearLayoutManager(this));
    mCommentField = (EditText) findViewById(R.id.comment_field);
    Button mCommentButton = (Button) findViewById(R.id.button_post_comment);
    mCommentButton.setOnClickListener(this);

    // Get post key from intent
    String mPostKey = getIntent().getStringExtra(EXTRA_POST_KEY);
    if (mPostKey == null) {
        throw new IllegalArgumentException("Must pass EXTRA_POST_KEY");
    }
    // Initialize Database
    mPostReference = FirebaseDatabase.getInstance().getReference().child("mainboard").child(mPostKey);
    mCommentsReference = FirebaseDatabase.getInstance().getReference().child("cm-mainboard").child(mPostKey);


}

@Override
public void onStart() {
    super.onStart();

    // Add value event listener to the post
    ValueEventListener postListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // Get Post object and use the values to update the UI
            PostMainboard post = dataSnapshot.getValue(PostMainboard.class);
            User user = dataSnapshot.getValue(User.class);

            mAuthorView.setText(user.uid);
            mTitleView.setText(post.postTopic);
            mBodyView.setText(post.postDetail);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            // Getting Post failed, log a message
            Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
            Toast.makeText(MainboardDetailActivity.this, "Failed to load post.", Toast.LENGTH_SHORT).show();
        }
    };
    mPostReference.addValueEventListener(postListener);

    // Keep copy of post listener so we can remove it when app stops
    mPostListener = postListener;

    // Listen for comments
    mAdapter = new CommentAdapter(this, mCommentsReference);
    mCommentsRecycler.setAdapter(mAdapter);
}

@Override
public void onStop() {
    super.onStop();
    if (mPostListener != null) {
        mPostReference.removeEventListener(mPostListener);
    }
    mAdapter.cleanupListener();
}

发布课程

public class PostMainboard{
public String uid;
public String auther;
public String postTopic;
public String postDetail;
public String postImageUrl;
public String postID;
private String postlatlon;
public long timeCreated;

public PostMainboard(){

}

public PostMainboard(String uid, String auther , String postTopic , String postDetail,long timeCreated)
{
    this.uid = uid;
    this.auther = auther;
    this.postTopic = postTopic;
    this.postDetail = postDetail;
    this.postImageUrl = postImageUrl;
    this.postID = postID;
    this.timeCreated = timeCreated;
}

@Exclude
public Map<String, Object> toMap() {
    HashMap<String, Object> result = new HashMap<>();
    result.put("mb_id", uid);
    result.put("mb_auther" , auther);
    result.put("mb_title", postTopic);
    result.put("mb_body", postDetail);
    result.put("mb_create", timeCreated);
    return result;
}

用户类

public class User {
public String uid;
public String user_fname;
private String user_lname;
private String user_idcard;
private String email;
private String user_phone;

public User(){

}


public User(String uid ,String user_fname, String user_lname, String user_idcard, String email, String user_phone) {
    this.uid = uid;
    this.user_fname = user_fname;
    this.user_lname = user_lname;
    this.user_idcard = user_idcard;
    this.email = email;
    this.user_phone = user_phone;
}

ViewHolder

public class MainboardViewHolder extends RecyclerView.ViewHolder {
private TextView authorView;
private TextView bodyView;
private TextView titleView;
private TextView dateView;

public MainboardViewHolder(View itemView) {
    super(itemView);
    authorView = (TextView)itemView.findViewById(R.id.txt_author);
    bodyView = (TextView)itemView.findViewById(R.id.post_detail);
    titleView = (TextView)itemView.findViewById(R.id.post_topic);
    dateView = (TextView)itemView.findViewById(R.id.post_date_time);
}

public void bindToPost (PostMainboard postMainboard)
{
    authorView.setText(postMainboard.auther);
    bodyView.setText(postMainboard.postDetail);
    titleView.setText(postMainboard.postTopic);
    dateView.setText((int) postMainboard.timeCreated);
}

主板片段

public  class MainboardFragment extends PostListFragment{


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

@Override
public Query getQuery(DatabaseReference databaseReference) {
    return databaseReference.child("mainboard").orderByKey();
}

1 个答案:

答案 0 :(得分:0)

看起来您忘记填充ViewHolder(MainboardViewHolder)。

在“populateViewHolder”下的“PostlistFragment”中,您需要调用viewHolder.bindToPost(model)将数据绑定到您的textview等等。

试试这个:

    @Override
    protected void populateViewHolder(final MainboardViewHolder viewHolder, final PostMainboard model, final int position) {
        final DatabaseReference postRef = getRef(position);

        viewHolder.bindToPost(model);

        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mActivity, MainboardDetailActivity.class);
                intent.putExtra(MainboardDetailActivity.EXTRA_POST_KEY, postRef.getKey());
                startActivity(intent);
            }
        });
    }

此外,您的getQuery方法是抽象的并且是空的。它应该看起来像这样:

@Override
public Query getQuery(DatabaseReference databaseReference) {
    return databaseReference.getReference("mainboard").orderByKey();
}

我说“可能”因为我看不到你是如何初始化mDatabase的。将来,如果你想要更好更快的答案,请粘贴完整的代码。