Java Firebase数据库设置收藏夹列表中的对象

Java Firebase数据库设置收藏夹列表中的对象,java,android,firebase,Java,Android,Firebase,我在清除碎片列表时遇到问题。我需要在发生片段更新时清除列表。我已经把它放在不同的地方,但它对我没有帮助 当更新发生在片段中时,它会显示相同的列表,但该列表也会添加上一个列表中的元素。如果我把list.clear();当它从firebase检索参数时,并没有给我所需的效果,当我将其放入onCreate()方法时,应用程序会给我错误 public class Favourite extends Fragment { private RecyclerView recyclerView; privat

我在清除碎片列表时遇到问题。我需要在发生片段更新时清除列表。我已经把它放在不同的地方,但它对我没有帮助

当更新发生在片段中时,它会显示相同的列表,但该列表也会添加上一个列表中的元素。如果我把
list.clear()
;当它从firebase检索参数时,并没有给我所需的效果,当我将其放入onCreate()方法时,应用程序会给我错误

public class Favourite extends Fragment {

private RecyclerView recyclerView;
private ArrayList<TourReader1> artistList;
private ToursAdapter1 adapter1;
private DatabaseReference reference,reference2;
String uid;

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

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    //Get current user id
    uid = user.getUid();
    //Connect to specific point in database Tours
    reference = FirebaseDatabase.getInstance().getReference("Tours");
    //Create add to method valuelistener or reference which is specific point in database
    reference2 = FirebaseDatabase.getInstance().getReference("user").child(uid);
    reference.addValueEventListener(valueEventListener);
    reference.keepSynced(true);

}
ValueEventListener valueEventListener = (new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot1) {
            //get all information from specific point of database
            for (DataSnapshot datasnapshot : snapshot1.getChildren()) {
                //get current name of starting point from where we recive information from database
                String firstname = datasnapshot.getKey();
                //valuelistener for another point from database
                reference2.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                            for (DataSnapshot dSnapshot2:snapshot.getChildren()){
                                String seconame = dSnapshot2.getKey();
                                Boolean control = dSnapshot2.child("like").getValue(Boolean.class);
                                if(control != null&&firstname.equals(seconame) &&control.equals(true)) {
                                    TourReader1 artist = datasnapshot.getValue(TourReader1.class);
                                    artistList.add(artist);
                                }
                            }
                        adapter1.notifyDataSetChanged();
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {

                    }
                });
            }
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    artistList = new ArrayList<>();
    View rootview = inflater.inflate(R.layout.favourite, container, false);
    recyclerView = rootview.findViewById(R.id.list);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    adapter1 = new ToursAdapter1(getContext(), artistList);
    recyclerView.setAdapter(adapter1);
    GridLayoutManager mGridLayoutManager = new GridLayoutManager(getContext(), 2);
    recyclerView.setLayoutManager(mGridLayoutManager);
    return rootview;
}
公共类扩展片段{
私人回收站;
私人阵列艺术家;
私人旅行车适配器1;
私有数据库参考,参考2;
字符串uid;
公众喜爱{
//必需的空公共构造函数
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(getArguments()!=null){
mParam1=getArguments().getString(ARG_PARAM1);
mParam2=getArguments().getString(ARG_PARAM2);
}
FirebaseUser=FirebaseAuth.getInstance().getCurrentUser();
//获取当前用户id
uid=user.getUid();
//连接到数据库中的特定点
reference=FirebaseDatabase.getInstance().getReference(“Tours”);
//创建添加到方法valuelistener或引用,该方法是数据库中的特定点
reference2=FirebaseDatabase.getInstance().getReference(“用户”).child(uid);
addValueEventListener(valueEventListener);
参考。保持同步(真);
}
ValueEventListener ValueEventListener=(新的ValueEventListener(){
@凌驾
公共void onDataChange(@NonNull DataSnapshot snapshot1){
//从数据库的特定点获取所有信息
对于(DataSnapshot DataSnapshot:snapshot1.getChildren()){
//获取从数据库接收信息的起点的当前名称
String firstname=datasnapshot.getKey();
//数据库中另一个点的valuelistener
reference2.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
对于(DataSnapshot dSnapshot2:snapshot.getChildren()){
字符串seconame=dSnapshot2.getKey();
布尔控制=dSnapshot2.child(“like”).getValue(Boolean.class);
if(control!=null&&firstname.equals(seconame)&&control.equals(true)){
TourReader1 artist=datasnapshot.getValue(TourReader1.class);
艺术家。添加(艺术家);
}
}
adapter1.notifyDataSetChanged();
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
artistList=新的ArrayList();
视图根视图=充气机。充气(R.layout.favorite,container,false);
recyclerView=rootview.findviewbyd(R.id.list);
recyclerView.setHasFixedSize(true);
setLayoutManager(新的LinearLayoutManager(getContext());
adapter1=新ToursAdapter1(getContext(),artistList);
recyclerView.setAdapter(适配器1);
GridLayoutManager mGridLayoutManager=新的GridLayoutManager(getContext(),2);
recyclerView.setLayoutManager(mGridLayoutManager);
返回rootview;
}

}

您应该在数据更改中的for循环之前使用artistList.clear()清除artistList,因为此列表正在触发上次回调的数据。

好的,我自己找到了答案,我通过
tourlist清除适配器中的列表。清除(
)并删除
用户点。保持同步(true)
;当like图标为false时

holder.sparkButton.setEventListener(new SparkEventListener() {
        @Override
        public void onEvent(ImageView button, boolean buttonState) {
            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
            String uid = user.getUid();
            DatabaseReference userpoints  = FirebaseDatabase.getInstance().getReference("user").child(uid);
            ToursLike registerDatabase = new ToursLike(true);
            if(buttonState){
                userpoints.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if (!dataSnapshot.hasChild(tour.Name)) {
                            userpoints.child(tour.Name).setValue(registerDatabase);
                            userpoints.keepSynced(true);
                            tourList.clear();
                        }
                        else{
                            userpoints.child(tour.Name).child("like").setValue(true);
                            userpoints.keepSynced(true);
                            tourList.clear();
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });

            }
            else{
                userpoints.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        userpoints.child(tour.Name).child("like").setValue(false);
                        tourList.clear();
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });
            }
        }

        @Override
        public void onEventAnimationEnd(ImageView button, boolean buttonState) {

        }

        @Override
        public void onEventAnimationStart(ImageView button, boolean buttonState) {

        }
    });
}

理解您的要求有点让人困惑,您能用非技术性的术语告诉我您期望的行为吗?我从firebase获取了一份巡更列表,并将其与另一个地方进行比较,如果用户是否喜欢此巡更。如果“喜欢”是真的,则此巡演转到“喜爱的巡演”列表。问题是当用户不喜欢最喜爱的旅游屏幕上的旅游列表更新,但也有以前列表中的元素时。我的问题是从ol元素中清除列表。你试过@dinkar_kumar answer吗?它能工作吗?不,我把它放在循环之前并添加adapter1.notifyDataSetChanged();但这不管用