Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java I';我在寻找一个解决方案,移除适配器中正确位置上的项目_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java I';我在寻找一个解决方案,移除适配器中正确位置上的项目

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

我今天一直在编码,因为我试图删除Firebase实时数据库中的一个子项,同时从ArrayList中删除该项,并且从RecyclerView中删除了错误的视图

@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);

    }