Android recyclerview 在数据更改后显示更多值

Android recyclerview shows more values after data change

我正在尝试编辑 recyclerview 中的一个项目,它显示了一些来自 Firebase 的数据。但编辑后数据集并没有改变。它显示 以前的 以及新的 更新的 项目,直到 activity 被 重新加载 .截图在最后给出。

我正在通过 alertdialog 编辑项目。以下是代码:

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.MyViewHolder> {
    ArrayList<User_Post> user_posts=null;
Context context;
public ListAdapter(@Nullable ArrayList<User_Post> posts, Context c) {
        this.user_posts=posts;      // the data set
        this.context=c;
    }

在项目的 编辑 按钮上单击 AlertDialog 打开:

  //'post' is an instance of type User_Post containing the current data item.

dialogBuilder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        if(isValid()) {
            post.setWorkType(txtType.getSelectedItem().toString());
            post.setWorkDescription(txtDetails.getText().toString());

            user_posts.set(position,post);
            updateDataSet(user_posts);

            saveToFirebase(post,"edit");
            Toast.makeText(context, "Post updated", Toast.LENGTH_SHORT).show();

        }
    }
}

更新 Firebase 数据的代码:

private void saveToFirebase(User_Post post, String task) {
    String id=post.getPostID();

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    FirebaseStorage storage = FirebaseStorage.getInstance();
    StorageReference storageRef = storage.getReferenceFromUrl("gs://smart-worker-c73c4.appspot.com/gs:");
    DatabaseReference myRef = database.getReference("posts");

    if(task.equals("edit")) {
        myRef.child(id).setValue(post);
    }
    else {
        myRef.child(id).setValue(null);
        storageRef.child(id).delete();
    }
}

更新数据集:

private void updateDataSet(ArrayList<User_Post> posts){
    this.user_posts=posts;
    notifyDataSetChanged();
}

编辑前的截图...

编辑后的截图...

我认为问题是你给列表的位置可能不正确,你没有提到你从哪里得到它以及何时更新它。

It shows previous as well as the new updated items, until the activity is reloaded

因此,当您重新加载 activity 时,新数据显示在 RecyclerView 上,因此数据已成功保存到 firebase 中,并在重新加载 activity 时抓取。所以,这个问题与 firebase 无关。

您还决定不为 firebase 设置持久事件侦听器,而是在本地更新了 RecyclerView

 private void updateDataSet(ArrayList<User_Post> posts){
        this.user_posts = posts;
        notifyDataSetChanged();
}

尽管我建议在通知更改之前清除并重建列表:

 private void updateDataSet(ArrayList<User_Post> posts){
        this.user_posts.clear();
        this.user_posts.addAll(posts);        
        notifyDataSetChanged();
}

这不是最佳程序,因为调用 notifyDataSetChanged() 很昂贵;相反,我建议 notifyItemInserted() or notifyItemRangeChanged();仅部署对 RecyclerView.

的更改

例如,如果您只传递一个项目:

 private void updateDataSet(User_Post post){
        this.user_posts.add(post);        
        notifyItemInserted(this.user_posts.size()-1);
}

对于一系列项目:

 private void updateDataSet(ArrayList<User_Post> posts){ // Pass only those items that are changed
        int currentSize = this.user_posts.size();
        this.user_posts.addAll(posts);   
        int newSize = this.user_posts.size();     
        notifyItemInserted(currentSize, newSize - 1);
}