FirebaseRecyclerView更新错误的商品

时间:2018-05-26 21:54:22

标签: android firebase firebase-realtime-database android-recyclerview firebaseui

我有一个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);
        }
    };

我也试过使用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) {

        }
    });

第二次更新

所以我的代码一直都是正确的我只是没有包含代码,我根据日期对ArrayList进行排序,这会破坏项目的顺序,从而删除错误的项目。

1 个答案:

答案 0 :(得分:2)

您无法在点击监听器中使用onBindViewHolder方法中的任何数据,因为它仅在第一次打勾期间有效。改为使用这样的模型:

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