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);
}
我正在尝试编辑 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);
}