Android FirebaseRecyclerView更新错误的项目

Android FirebaseRecyclerView更新错误的项目,android,firebase,firebase-realtime-database,android-recyclerview,firebaseui,Android,Firebase,Firebase Realtime Database,Android Recyclerview,Firebaseui,我有一个RecyclerView,你可以在那里添加/删除项目。我的问题是适配器显示了我选择删除的错误项(不更新该项)。我的意思是,在我的数据库中,它删除了正确的项目,但在应用程序中它是错误的,除非我重新启动活动,然后它将更新并显示正确的项目。我认为这实际上可能是FirebaseAdapter的一个小故障。我不太确定,但无论如何,这是我的代码 FirebaseRecyclerOptions<Event> firebaseRecyclerOptions = new FirebaseRec

我有一个RecyclerView,你可以在那里添加/删除项目。我的问题是适配器显示了我选择删除的错误项(不更新该项)。我的意思是,在我的数据库中,它删除了正确的项目,但在应用程序中它是错误的,除非我重新启动活动,然后它将更新并显示正确的项目。我认为这实际上可能是FirebaseAdapter的一个小故障。我不太确定,但无论如何,这是我的代码

FirebaseRecyclerOptions<Event> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<Event>()
            .setQuery(query, Event.class).build();
    firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Event, ProductHolder>(firebaseRecyclerOptions) {
        @Override
        protected void onBindViewHolder(final ProductHolder holder, final int position, Event model) {
            model = mDataSet.get(position);
            holder.mItemName.setText(model.getName());
            holder.mItemDate.setText(model.getDate());
            final Event finalModel = model;
            holder.relativeLayout.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    mDatabaseFreezer.child(finalModel.get_id()).removeValue(); //this is how I remove the item
                    return true;
                }
            });

}

        @Override
        public ProductHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.recycler_view_row_snippet,parent,false);

            return new ProductHolder(view);
        }
    };
FirebaseRecyclerOptions FirebaseRecyclerOptions=新建FirebaseRecyclerOptions.Builder()
.setQuery(查询,事件.class).build();
firebaseRecyclerAdapter=新的firebaseRecyclerAdapter(firebaseRecyclerOptions){
@凌驾
受保护的无效onBindViewHolder(最终产品持有者、最终整数位置、事件模型){
model=mDataSet.get(位置);
holder.mItemName.setText(model.getName());
holder.mItemDate.setText(model.getDate());
最终事件最终模型=模型;
holder.relativeLayout.setOnLongClickListener(新视图。OnLongClickListener(){
@凌驾
仅长按公共布尔值(视图){
mDatabaseFreezer.child(finalModel.get_id()).removeValue();//我就是这样删除该项的
返回true;
}
});
}
@凌驾
public ProductHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.recycler\u view\u row\u snippet,parent,false);
返回新产品持有者(视图);
}
};
我还尝试使用notifyDataSetChange,但我认为FirebaseAdapter实际上并不需要它

更新

这就是我从数据库中获取数据的方式

 mDatabaseFreezer.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            HashMap<String, String> value = (HashMap<String,String>) dataSnapshot.getValue();
            if (value != null) {
                String name = value.get("Name");
                String date = value.get("Date");
                String key = value.get("Key");
                String productAmount = value.get("Amount");

                Event event = new Event();
                event.setId(key);

                mDataSet.add(new Event(name,date, key, productAmount));

            }
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
mDatabaseFreezer.addChildEventListener(新的ChildEventListener()){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
HashMap值=(HashMap)dataSnapshot.getValue();
if(值!=null){
字符串名称=value.get(“名称”);
字符串日期=value.get(“日期”);
字符串key=value.get(“key”);
字符串productAmount=value.get(“金额”);
事件=新事件();
事件.setId(key);
add(新事件(名称、日期、键、productAmount));
}
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
第二次更新


因此,我的代码一直都是正确的,我只是没有包含根据日期对ArrayList进行排序的代码,这打乱了项目的顺序,因此删除了错误的项目。

您不能在单击侦听器中使用
onBindViewHolder
方法中的任何数据,因为它仅在第一次勾选期间有效。将您的模型改为如下:

getItem(holder.getAdapterPosition()).get_id()

不能在单击侦听器中使用来自
onBindViewHolder
方法的任何数据,因为它仅在第一次勾选期间有效。将您的模型改为如下:

getItem(holder.getAdapterPosition()).get_id()

不确定答案,但我会将任何onClickListeners的设置移到onCreateViewHolder方法中,而不是将所有内容都设置为最终结果。性能更好。您可以使用getAdapterPosition()获得单击的位置。我最近没有使用firebase sdk,情况可能已发生变化,但通常您会从适配器中删除数据。类似于此的内容:firebaseRecyclerAdapter.getRef(位置).removeValue();也许您必须在适配器上注册AdapterDataObserver(firebaseRecyclerAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver(){…});你解决问题了吗?@AlexMamo不确定答案,但我会将所有onClickListeners的设置移到onCreateViewHolder方法中,而不是将所有内容都设置为最终值。性能更好。你可以使用getAdapterPosition()获得单击位置。我最近没有使用firebase sdk,情况可能发生了变化,但通常您会从适配器中删除数据。类似于此的内容:firebaseRecyclerAdapter.getRef(position).removeValue();可能您必须在适配器上注册AdapterDataObserver(firebaseRecyclerAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver(){…});你解决问题了吗?@AlexMamo not yetI不能使用该方法获取id(),因为正如你所看到的,我的模型也是一个类。你知道我该如何通过它吗?
getItem(holder.getAdapterPosition())
将返回一个
事件
so
get\u id()
将可用。除非有编译器错误?您的权利,所以我做了
String t=getItem(holder.getAdapterPosition())。get_id();
字符串返回null,原因可能是数据库没有正确映射到模型。请使用
setId(String)
getId()
而不是下划线。哦,确保您的字段是私有的。我检查了所有内容,以便在模型中设置setId,并将set_id和get_id更改为setId和getId,同时确保字段是私有的,但仍然返回null。我已更新了我的问题,以便您可以看到我如何设置IdI不能使用get_id()使用该方法,因为正如您所看到的,我的模型也是一个类。您知道我如何度过这个难关吗?
getItem(holder.getAdapterPosition())
将返回一个
事件
so
get\u id()
将可用。除非有编译器错误?您的权利,我这样做了
String t=getItem(holder.getAdapterPosition())1.得到