【发布时间】:2020-12-01 02:50:08
【问题描述】:
这是我第一次在 stackoverflow 上提问 :)。在我正在构建的应用程序中,用户可以在回收站视图中看到他们保存的笔记,如图所示(PS:所有屏幕截图均来自真实设备,而不是来自模拟器,我不允许嵌入图片,所以这里是链接) : saved notes
当他们单击特定注释时,可以选择查看和编辑该注释。 但问题是,在保存编辑的笔记并导航回查看笔记活动后,recyclerview 中的笔记没有更新,但新项目显示在原始项目下方: updated recyclerview
如果我从回收站视图中删除一个项目,也会出现同样的问题,即剩余项目显示在原始项目下方,例如:这里我删除了第二个注释:second note deleted
当我导航回 mainactivity 并再次打开保存的笔记活动时,recyclerview 也会正确更新。 这些是代码:
- 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);
}
}
}
- 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