Java I';我在寻找一个解决方案,移除适配器中正确位置上的项目
我今天一直在编码,因为我试图删除Firebase实时数据库中的一个子项,同时从ArrayList中删除该项,并且从RecyclerView中删除了错误的视图Java I';我在寻找一个解决方案,移除适配器中正确位置上的项目,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我今天一直在编码,因为我试图删除Firebase实时数据库中的一个子项,同时从ArrayList中删除该项,并且从RecyclerView中删除了错误的视图 @Override protected void onStart() { super.onStart(); valueEventLis = Ref.addValueEventListener(new ValueEventListener() { @Override
@Override
protected void onStart() {
super.onStart();
valueEventLis = Ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
list = new ArrayList<>();
for (DataSnapshot snapshot : dataSnapshot.getChildren())
//... etc list.add(snapshot.getValue(etc.class));
populateRV(list);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
另外,同样的东西在另一个片段上效果很好,我不知道为什么
下面是我在片段中填充回收视图的方法:
private void populateRV(ArrayList myTasksArrayList){
MyTasksAdapter MyTasksAdapter=新的MyTasksAdapter(myTasksArrayList,getActivity());
myTasksAdapter.notifyDataSetChanged();
myTasksRV.setAdapter(myTasksAdapter);
myTasksRV.setHasFixedSize(true);
LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(getActivity());
linearLayoutManager.setStackFromEnd(true);
linearLayoutManager.setReverseLayout(true);
myTasksRV.setLayoutManager(linearLayoutManager);
//query.removeEventListener(这个);
}
在ValueEventListener
中调用上述方法,以获取数据并将其添加到ArrayList
这是BindViewHolder的onBindViewHolder
:
@覆盖
public void onBindViewHolder(@NonNull final MyTasksViewHolder holder,final int position){
title=myTasksArrayList.get(position.getTitle();
category=myTasksArrayList.get(position.getCategory();
description=myTasksArrayList.get(position.getDescription();
helperName=myTasksArrayList.get(position.getHelperName();
timeStamp=myTasksArrayList.get(position.getTimestamp();
holder.taskTitle.setText(标题);
holder.taskCategory.setText(类别);
holder.taskDescription.setText(说明);
holder.deleteBtn.setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
myTasksArrayList.remove(holder.getAdapterPosition());
notifyItemRemoved(holder.getAdapterPosition());
removeChildFromDatabase();
}
});
问题1:
当我按下deleteBtn
时,将从RecyclerView
中删除错误的项目
问题2:
如果我删除
valueventListener
://query.removeEventListener(此);
将删除正确的项,但如果我向列表中添加项,则之后将不会显示,因为ValueEventListener
将保持删除状态。您正在处理一个对象类,该类对象实时从Firebase发送值,并将这些值存储在对象类型类的ArrayList中
在我看来,没有必要删除RecyclerView中的每个元素。同时在Firebase中修改它在适配器中修改
问题1:
问题2:
在此问题中,您必须恢复数据,当应用程序停止以避免任何其他问题时,您应该删除removeEventListener
@Override
protected void onStart() {
super.onStart();
valueEventLis = Ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
list = new ArrayList<>();
for (DataSnapshot snapshot : dataSnapshot.getChildren())
//... etc list.add(snapshot.getValue(etc.class));
populateRV(list);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
我不明白你的具体意图。你是想从Firebase中删除一个项目并修改适配器吗?@Molnar Attilaw如果你更改此行
myTasksArrayList.remove(holder.getAdapterPosition());
成为此行myTasksArrayList.remove(position)是的,从Firebase中删除并修改适配器@AdelB Lahlouh:)我在Ticherhaz尝试了它,但不幸的是这是同一件事谢谢你Adel B-Lahlouh:)我会尝试的。我认为你是对的。我不应该一个接一个地从Recyclerview中删除元素。我想这就是我犯错误的地方。我会尽快回复你,事情会怎样。:)好的,兄弟,我为你服务@Molnar AttilaI试图实现这个解决方案,但它不起作用。我的步骤是:我向实时数据库添加一个子项,10秒钟后,我按下RecyclerView上项目的删除按钮,删除列表上的最后一个项目,而不是我按下的项目。这很奇怪……应该是与Firebase实例方法:-?是否删除了Firebase中的错误项?如果是,请确保引用正确,您必须通过list.get(position)提供要删除引用的对象否,它删除了正确的子项。引用是正确的。适配器和ValueEventListener之间存在某种差异。从逻辑上讲,当我从数据库中删除子项时,它应该从RecyclerView中删除相同的项,而不是删除最后一项。
@Override
protected void onPause() {
super.onPause();
if (valueEventLis != null)
Ref.removeEventListener(valueEventLis);
}