【问题标题】:Updating Recycler View according to Firebase Database根据 Firebase 数据库更新回收站视图
【发布时间】:2020-12-01 02:50:08
【问题描述】:

这是我第一次在 stackoverflow 上提问 :)。在我正在构建的应用程序中,用户可以在回收站视图中看到他们保存的笔记,如图所示(PS:所有屏幕截图均来自真实设备,而不是来自模拟器,我不允许嵌入图片,所以这里是链接) : saved notes

当他们单击特定注释时,可以选择查看和编辑该注释。 但问题是,在保存编辑的笔记并导航回查看笔记活动后,recyclerview 中的笔记没有更新,但新项目显示在原始项目下方: updated recyclerview

如果我从回收站视图中删除一个项目,也会出现同样的问题,即剩余项目显示在原始项目下方,例如:这里我删除了第二个注释:second note deleted

当我导航回 mainactivity 并再次打开保存的笔记活动时,recyclerview 也会正确更新。 这些是代码:

  1. ViewSavedNotesAdapter.java
public class ViewSavedNotesAdapter extends RecyclerView.Adapter<ViewSavedNotesAdapter.ViewHolder>{

    ArrayList<ViewSavedNotedModel> list;
    Context context;
    FirebaseAuth auth = FirebaseAuth.getInstance();

    public ViewSavedNotesAdapter() {

    }

    public ViewSavedNotesAdapter(ArrayList<ViewSavedNotedModel> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.notes_view, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
        ViewSavedNotedModel model = list.get(position);
        holder.noteName.setText(model.getNoteName());
        holder.data.setText(model.getData());



        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                context.startActivity(new Intent(context, SelectedNoteViewActivity.class)
                .putExtra("noteName", model.getNoteName())
                .putExtra("data", model.getData()));
            }
        });

        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
                alertDialog.setCancelable(true)
                        .setTitle("Do you really want to delete this note?")
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                String name = model.getNoteName();
                                String userId = auth.getUid();
                                DatabaseReference reference = FirebaseDatabase.getInstance()
                                        .getReference();
                                Query delete = reference.child("UserData").child(userId)
                                        .orderByChild("Note Name").equalTo(name);
                                delete.addListenerForSingleValueEvent(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                                        for (DataSnapshot deleteSnapshot : snapshot.getChildren()) {
                                            deleteSnapshot.getRef().removeValue();
                                        }
                                    }

                                    @Override
                                    public void onCancelled(@NonNull DatabaseError error) {

                                    }
                                });

                            }
                        })
                        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                            }
                        })
                        .show();

                return true;
            }
        });
    }

    public void updateList(ArrayList<ViewSavedNotedModel> newList) {
        this.list = newList;
        this.notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView noteName, data;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            noteName = (TextView) itemView.findViewById(R.id.note_name);
            data = (TextView) itemView.findViewById(R.id.data);
        }
    }
}
  1. SavedNotesActivity.java
public class SavedNotesActivity extends AppCompatActivity {

    ActivitySavedNotesBinding activitySavedNotesBinding;
    DatabaseReference databaseReference;
    ProgressDialog progressDialog;
    ArrayList<ViewSavedNotedModel> list = new ArrayList<>();
    FirebaseAuth auth;
    ViewSavedNotesAdapter adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        activitySavedNotesBinding = ActivitySavedNotesBinding.inflate(getLayoutInflater());
        super.onCreate(savedInstanceState);
        setContentView(activitySavedNotesBinding.getRoot());
        auth = FirebaseAuth.getInstance();

        progressDialog = new ProgressDialog(SavedNotesActivity.this);
        progressDialog.setTitle("Loading Saved Notes");
        progressDialog.setMessage("Please wait, your saved notes are being loaded");
        progressDialog.show();

        String userId = auth.getCurrentUser().getUid();

        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference()
                .child("UserData").child(userId);

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {

                if (snapshot.exists()) {


                    for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                        String noteName = (String) dataSnapshot.child("Note Name").getValue();
                        String data = (String) dataSnapshot.child("Data").getValue();


                        list.add(new ViewSavedNotedModel(noteName, data));
                        adapter = new ViewSavedNotesAdapter(list,
                                SavedNotesActivity.this);
                        activitySavedNotesBinding.notesView.setAdapter(adapter);
                        activitySavedNotesBinding.notesView.setLayoutManager(new LinearLayoutManager
                                (SavedNotesActivity.this));
                        adapter.updateList(list);

                        progressDialog.dismiss();
                    }
                }
                else {
                    progressDialog.dismiss();
                    Snackbar.make(activitySavedNotesBinding.notesView, "There are no notes",
                            Snackbar.LENGTH_SHORT).show();
                }


            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Snackbar.make(activitySavedNotesBinding.notesView, "Failed to load Data",
                        Snackbar.LENGTH_SHORT).show();
            }
        });


    }

}

我一直试图找出问题所在,但不幸的是无法解决。任何帮助将非常感激。 :)

【问题讨论】:

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


    【解决方案1】:

    onDataChange 中添加新笔记之前,您需要清除笔记列表:

     databaseReference.addValueEventListener(new ValueEventListener() {
         @Override
         public void onDataChange(@NonNull DataSnapshot snapshot) {
    
             if (snapshot.exists()) {
                 list.clear();
    
                 for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                     ...
    

    【讨论】:

    • 嗯,这真的帮助了人,非常感谢。从来没有想过清除列表xD。但是还有一个问题,列表中的最后一个注释在删除时并没有被清除,而是在返回到 mainactivity 再返回时被清除。所有笔记在点击删除时都会立即清除,除了最后一个.. 有什么解决办法..??
    猜你喜欢
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多