Java Firebase回收器查看重复数据
我试图从数据库中检索注释,但它将所有注释显示为重复 同样的listner可以很好地处理片段,但在活动上实现时会出现重复项错误Java Firebase回收器查看重复数据,java,android,firebase,firebase-realtime-database,firebaseui,Java,Android,Firebase,Firebase Realtime Database,Firebaseui,我试图从数据库中检索注释,但它将所有注释显示为重复 同样的listner可以很好地处理片段,但在活动上实现时会出现重复项错误 private void startListening() { Query query = mCommentsDatabase; FirebaseRecyclerOptions<Comment> options = new FirebaseRecyclerOptions.Builder<Comment>()
private void startListening() {
Query query = mCommentsDatabase;
FirebaseRecyclerOptions<Comment> options =
new FirebaseRecyclerOptions.Builder<Comment>()
.setQuery(query, Comment.class)
.build();
FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<Comment, CommentsViewHolder>(options){
@Override
public CommentsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Create a new instance of the ViewHolder, in this case we are using a custom
// layout called R.layout.message for each item
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.single_comment_item, parent, false);
return new CommentsViewHolder(view);
}
@Override
protected void onBindViewHolder(final CommentsViewHolder holder, int position, final Comment model) {
mCommentsDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
if (dataSnapshot.exists() && dataSnapshot != null){
if (dataSnapshot.exists()){
String CommenterId = dataSnapshot.child("uid").getValue().toString();
mUsersDatabase.child(CommenterId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot userDataSnapshot) {
if (userDataSnapshot.exists()){
String username = userDataSnapshot.child("username").getValue().toString();
String thumbImage = userDataSnapshot.child("profile_thumbnail").getValue().toString();
String comment = dataSnapshot.child("body").getValue().toString();
Long timestamp = Long.parseLong(dataSnapshot.child("timestamp").getValue().toString());
GetTimeAgo getTimeAgo = new GetTimeAgo();
String time = getTimeAgo.getTimeAgo(timestamp, getApplicationContext());
holder.setName(username);
holder.setComment(comment);
holder.setImage(thumbImage, getApplicationContext());
holder.setTime(time);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
};
mCommentsList.setAdapter(adapter);
adapter.startListening();
}
private void startListening(){
Query Query=mCommentsDatabase;
FirebaseRecyclerOptions选项=
新的FirebaseRecyclerOptions.Builder()
.setQuery(查询,注释.class)
.build();
FirebaseRecyclerAdapter=新的FirebaseRecyclerAdapter(选项){
@凌驾
公共评论ViewHolder onCreateViewHolder(视图组父级,int-viewType){
//创建ViewHolder的新实例,在本例中,我们使用自定义
//为每个项目调用R.layout.message的布局
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.single_comment_item,父项,false);
返回新评论查看文件夹(视图);
}
@凌驾
受保护的无效onBindViewHolder(最终注释文件夹持有人、int位置、最终注释模型){
mCommentsDatabase.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildaded(@NonNull DataSnapshot DataSnapshot,@null字符串s){
if(dataSnapshot.exists()&&dataSnapshot!=null){
if(dataSnapshot.exists()){
String CommenterId=dataSnapshot.child(“uid”).getValue().toString();
mUsersDatabase.child(CommenterId).addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot userDataSnapshot){
if(userDataSnapshot.exists()){
字符串username=userDataSnapshot.child(“username”).getValue().toString();
字符串thumbImage=userDataSnapshot.child(“profile_缩略图”).getValue().toString();
String comment=dataSnapshot.child(“body”).getValue().toString();
Long timestamp=Long.parseLong(dataSnapshot.child(“timestamp”).getValue().toString());
GetTimeAgo GetTimeAgo=new GetTimeAgo();
String time=getTimeAgo.getTimeAgo(时间戳,getApplicationContext());
holder.setName(用户名);
holder.setComment(注释);
setImage(thumbImage,getApplicationContext());
设置时间(time);
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
}
}
@凌驾
public void onChildChanged(@NonNull DataSnapshot DataSnapshot,@null字符串s){
}
@凌驾
公共void onChildRemoved(@NonNull DataSnapshot DataSnapshot){
}
@凌驾
public void onChildMoved(@NonNull DataSnapshot DataSnapshot,@null字符串s){
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
};
mCommentsList.setAdapter(适配器);
adapter.startListening();
}
有人能帮我指出出了什么问题吗
我已经在片段中实现了相同的东西,但在活动中使用时,它的工作方式很奇怪。为什么要调用adapter.startListening();在同一个函数中?我已将其设置在startListening方法的作用域下。建议您使用
FirebaseRecyclerAdapter
从Firebase实时数据库检索数据并将其显示在RecyclerView
中。