【问题标题】:Android app crashes upon removing an item from FirebaseRecyclerAdapter从 FirebaseRecyclerAdapter 中删除项目时,Android 应用程序崩溃
【发布时间】:2017-11-22 10:31:57
【问题描述】:

我在 populateViewHolder 中创建了一个删除函数,如下所示:

viewHolder.mView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        new AlertDialog.Builder(getContext())
                .setTitle("Are you sure?")
                .setMessage("Do you want to delete this note?")
                .setPositiveButton("Yes", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        mNotesDatabase.child(list_id).removeValue();
                        notifyDataSetChanged();
                        notifyItemRemoved(position);
                    }
                })
                .setNegativeButton("No", null)
                .show();

        return true;
    }
});

此代码存在于:public void onDataChange(DataSnapshot dataSnapshot). 当我运行我的代码并尝试从列表中删除该项目时,我的应用程序崩溃了。但是,它确实会删除数据库本身中的项目。我认为我的应用程序没有正确更新FirebaseRecycleAdapter。我尝试使用notifydatasetchanged(),但没有任何结果。我还尝试覆盖onChildRemoved。然而 onChildRemoved 似乎不是FirebaseRecycleAdapter 中的函数。我还尝试调用FirebaseRecycleAdapter 本身,它告诉我它没有初始化。

这里是 logCat:

编辑

在此文本下方,您可以根据要求找到整个适配器的代码:

        final FirebaseRecyclerAdapter<Notes, NotesViewHolder> notesRecyclerViewAdapter = new FirebaseRecyclerAdapter<Notes, NotesViewHolder>(
            Notes.class,
            R.layout.feed_note_single_layout,
            NotesViewHolder.class,
            mNotesDatabase
    ) {

        @Override
        protected void populateViewHolder(final NotesViewHolder viewHolder, Notes model, final int position) {

            final String list_id = getRef(position).getKey();

            mNotesDatabase.child(list_id).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    final String title = dataSnapshot.child("title").getValue().toString();
                    final String message = dataSnapshot.child("message").getValue().toString();

                    viewHolder.setTitle(title);
                    viewHolder.setMessage(message);

                    viewHolder.mView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent noteIntent = new Intent(getContext(), NotesActivity.class);
                            noteIntent.putExtra("list_id", list_id);
                            noteIntent.putExtra("title", title);
                            noteIntent.putExtra("message", message);
                            startActivity(noteIntent);

                        }
                    });

                    viewHolder.mView.setOnLongClickListener(new View.OnLongClickListener() {
                        @Override
                        public boolean onLongClick(View v) {
                            new AlertDialog.Builder(getContext())
                                    .setTitle("Are you sure?")
                                    .setMessage("Do you want to delete this note?")
                                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {



                                            mNotesDatabase.child(list_id).removeValue();
                                            notifyItemRemoved(viewHolder.getAdapterPosition());
                                            notifyDataSetChanged();


                                        }
                                    })
                                    .setNegativeButton("No", null)
                                    .show();

                            return true;
                        }
                    });

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    };

    mFeedList.setAdapter(notesRecyclerViewAdapter);

【问题讨论】:

  • 发布错误日志和问题
  • 你的mNotesDatabase有什么价值?请添加您关于mNotesDatabase的代码。
  • 在发生此崩溃的位置(即第 201 行)发布您的 NotesActivity 类的代码
  • 请将完整代码发到populateViewHolder

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


【解决方案1】:

我认为问题可能是因为当您删除RecyclerView 中的数据并调用notifyDataSetChanged() 时。 populateViewHolder 中的 position 可能指的是已删除的 position

因此,您应该使用viewHolder.getAdapterPosition() 而不是position

根据日志,问题也可能来自onDataChange in NoteActivity,请仔细检查。

希望对你有帮助。

【讨论】:

  • 您是否将所有 position 更改为 viewHolder.getAdapterPosition() ?包括这一行final String list_id = getRef(position).getKey();
  • 刚刚替换了list_id。然而它仍然会因同样的错误而崩溃
  • 成为final String list_id = getRef(itemView.getAdapterPosition()).getKey(); ?
  • final String list_id = getRef(viewHolder.getAdapterPosition()).getKey();
  • 那么问题可能出在NoteActivity,请将onDataChange的代码贴在那个Activity中
【解决方案2】:

在删除下面的项目后调用 notifyDataSetChanged()

 mNotesDatabase.child(list_id).removeValue();

 notifyItemRemoved(position);
 notifyDataSetChanged();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多