Android - 数据更改的Firebase刷新页面

时间:2017-12-23 08:36:23

标签: android firebase firebase-realtime-database android-recyclerview

我是Android的新手。 我有一个Recyclerview,我存储在Firebase数据库中。 我的recyclerview由cardviews组成。 在每个cardview中,我有一个按钮,用于更新Firebase中的节点信息。 每次发生上述情况时,我的页面都会刷新(我想加载新数据)。

我的主要活动代码相关代码(在onCreate上调用):

  private void loadRecyclerViewData() {

    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (posts.size() > 0) {
                posts.clear();
            }

            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                Post post = ds.getValue(Post.class);
                //Getting a specific user's information (nickname purposes)
                if (post.getSubGenreType().equals(SubGenreString)) {
                    posts.add(post);
                    Collections.reverse(posts);
                }
            }
            adapter = new RecyclerAdapter(posts, getApplicationContext());
            recyclerView.setAdapter(adapter);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


}

我的适配器:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
public static Boolean isAyed = false;
private FirebaseAuth firebaseAuth;
private List<Post> posts;
private Context context;
private String userTryToAyeEmail;

public RecyclerAdapter(List<Post> posts, Context context) {
    this.posts = posts;
    this.context = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    firebaseAuth = FirebaseAuth.getInstance();

    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.recycle_card, parent, false);
    return new ViewHolder(v);
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    final Post post = posts.get(position);
    holder.imageButton.setVisibility(View.GONE);
    holder.editText.setVisibility(View.GONE);

    String colorString = post.getPostColor();
    int color = Color.parseColor(colorString);
    int newNumOfLikes = post.getPostLikes();
    int currentNumOfLikes = post.getPostLikes();
    // holder.cardView.setCardBackgroundColor(color);
    holder.textViewHead.setText(post.getPostContent());
    holder.textViewNickname.setText(post.getPostNickname());
    holder.textViewTimeStamp.setText(post.getPostTimeStamp());

    holder.ayeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Boolean userLiked = false;
            if (firebaseAuth.getCurrentUser() != null) {
                String currentUserEmail = firebaseAuth.getCurrentUser().getEmail();
                List<String> currentLikedPost = post.getUserLikedList();
                for (int i = 0; i < currentLikedPost.size(); i++) {
                    if (currentUserEmail.equals(currentLikedPost.get(i))) {
                        currentLikedPost.remove(i);
                        int newNumOfLikes = post.getPostLikes() - 1;
                        updateLikes(post.getId(), newNumOfLikes, post.getPostNickname(), post.getPostTimeStamp(), post.getPostContent(), post.getPostColor(), post.getSubGenreType(), post.getUserLikedList());
                        userLiked = true;

                        break;
                    }
                }
                if (!userLiked) {
                    currentLikedPost.add(currentUserEmail);
                    int newNumOfLikes = post.getPostLikes() + 1;
                    updateLikes(post.getId(), newNumOfLikes, post.getPostNickname(), post.getPostTimeStamp(), post.getPostContent(), post.getPostColor(), post.getSubGenreType(), post.getUserLikedList());
                }
            }
        }
    });

    if (firebaseAuth.getCurrentUser() != null) {
        String currentUserEmail = firebaseAuth.getCurrentUser().getEmail();

        List<String> usersLikedPost = post.getUserLikedList();
        for (int i = 0; i < usersLikedPost.size(); i++) {
            if (currentUserEmail.equals(usersLikedPost.get(i))) {
                holder.ayeButton.setTextColor(Color.parseColor("#FF0000"));
                break;
            }

        }
    }

    holder.ayeTextView.setText(Integer.toString(newNumOfLikes));

    holder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent myIntent = new Intent(context, SinglePostActivity.class);
            myIntent.putExtra("postID", post.getId());
            myIntent.putExtra("postNickname", post.getPostNickname());
            myIntent.putExtra("postTimeStamp", post.getPostTimeStamp());
            myIntent.putExtra("postContent", post.getPostContent());
            myIntent.putExtra("postColor", post.getPostColor());
            context.startActivity(myIntent);

        }
    });
}

private void updateLikes(String id, int newNumOfLikes, String postNickname, String postTimeStamp, String postContent, String postColor, String SubGenre, List<String> userLikedPostList) {
    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("posts").child(id);

    Post post = new Post(postColor, postContent, postNickname, postTimeStamp, id, newNumOfLikes, SubGenre, userLikedPostList);
    databaseReference.setValue(post);


}

@Override
public int getItemCount() {
    return posts.size();
}


public class ViewHolder extends RecyclerView.ViewHolder {

    public TextView textViewHead;
    public TextView textViewNickname;
    public TextView textViewTimeStamp;
    public TextView ayeButton;
    public TextView ayeTextView;
    public CardView cardView;
    public LinearLayout linearLayout;
    public EditText editText;
    public ImageButton imageButton;

    public ViewHolder(View itemView) {
        super(itemView);
        textViewHead = (TextView) itemView.findViewById(R.id.textViewHead);
        textViewNickname = (TextView) itemView.findViewById(R.id.textViewNickname);
        textViewTimeStamp = (TextView) itemView.findViewById(R.id.textViewTimeStamp);
        ayeButton = (TextView) itemView.findViewById(R.id.ayeButton);
        ayeTextView = (TextView) itemView.findViewById(R.id.ayeTextView);
        cardView = (CardView) itemView.findViewById(R.id.cardViewID);
        linearLayout = (LinearLayout) itemView.findViewById(R.id.cardLinearLayout);
        editText = (EditText) itemView.findViewById(R.id.addCommentEditText);
        imageButton = (ImageButton) itemView.findViewById(R.id.addCommentImageButton);

    }

}

}

我希望页面留在原地,我该怎么做? 谢谢大家。

1 个答案:

答案 0 :(得分:1)

onCreate中设置适配器并从onDataChange

通知它
 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);
    //initialize
    .
    .
    //set adapter
    adapter = new RecyclerAdapter(posts, getApplicationContext());
    recyclerView.setAdapter(adapter);
} 

private void loadRecyclerViewData() {

    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (posts.size() > 0) {
                posts.clear();
            }

            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                Post post = ds.getValue(Post.class);
                //Getting a specific user's information (nickname purposes)
                if (post.getSubGenreType().equals(SubGenreString)) {
                    posts.add(post);
                    Collections.reverse(posts);
                }
            }
            adapter.notifyDataSetChanged(); //notify
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}