在RecyclerView中通知Firestore数据的更改

问题描述 投票:0回答:1

在我的应用程序中,有一个片段包含一个可扩展的RecyclerView从Firebase Firestore获取数据,其中的每个项目都有一个按钮,单击该按钮可以更改Firestore中的某些数据,这些数据会以某种方式影响项目。现在的问题是:当运行应用程序并单击按钮时,直到刷新片段,数据才会更改。

fragment.java:

    View root = inflater.inflate(R.layout.fragment_dashboard, container, false);
    final String UserId =currentUser.getUid();

    final RecyclerView recyclerView = root.findViewById(R.id.recyclerview);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

    db.collectionGroup("Id").whereEqualTo("id" , UserId).get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    final List<Company> Parent = new ArrayList<>();

                    for (QueryDocumentSnapshot document : task.getResult()) {
                        final List<String> grades = (List<String>) document.get("tagsG");

                        CollectionReference collectionReference = 
                          document.getReference().getParent();
                        final List<Product> Child = new ArrayList<>();
                            for (int i = 0; i < grades.size(); i++) {
                            final String gg = grades.get(i);
                        collectionReference.document(UserId).collection(gg).get()
                                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                    @Override
                                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                                        for (QueryDocumentSnapshot document : task.getResult()) {
                                            String name = document.getString("std_name");
                                            String sub = document.getString("std_subject");
                                            String region = document.getString("std_region");                                           
                                            Child.add(new Product(name, sub, region, gg));
                                        }
                                    }
                                });
                        }
                        Parent.add(new Company("new", Child));
                        productAdapter = new ProductAdapter(Parent);
                        recyclerView.setAdapter(productAdapter);
                    }
                    }
            });
    return root;

ViewHolder.java

public class ProductViewHolder extends ChildViewHolder {
private FirebaseFirestore db = FirebaseFirestore.getInstance();
private FirebaseAuth mAuth=FirebaseAuth.getInstance();
private FirebaseUser currentUser= mAuth.getCurrentUser();
private String UserId =currentUser.getUid();
private TextView name;
private TextView sTextView;
private TextView region;
private Button addButton;
private String phoneOfstd;
private String grade;
private ProductAdapter productAdapter;


public ProductViewHolder(View itemView) {
    super(itemView);
    name = itemView.findViewById(R.id.name);
    sTextView = itemView.findViewById(R.id.sub);
    region = itemView.findViewById(R.id.region);
}

public void bind(Product product){
    name.setText(product.name);
    sTextView.setText(product.sub);
    region.setText(product.region);
    grade = product.grade;


    addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            CollectionReference questionsRef = db.collection("Teachers checked").document("courses").collection("Id");
            DocumentReference docRef = questionsRef.document(UserId).collection(grade).document(phoneOfstd);
            docRef.update("approvedStd", 1);
            productAdapter.notifyDataSetChanged();
        }
    });
}

}

Product.java

public class Product implements Parcelable {
public final String name;
public final String sub;
public final String region;
public final String grade;

public Product(String name, String sub, String region, String grade) {
    this.name = name;
    this.sub = sub;
    this.region = region;
    this.grade = grade;
}

protected Product(Parcel in) {
    name = in.readString();
    sub = in.readString();
    region = in.readString();
    grade = in.readString();
}

public static final Creator<Product> CREATOR = new Creator<Product>() {
    @Override
    public Product createFromParcel(Parcel in) {
        return new Product(in); }

    @Override
    public Product[] newArray(int size) {
        return new Product[size];
    }
};

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(name);
    dest.writeString(sub);
    dest.writeString(region);
    dest.writeString(grade);
}
}

在我的应用程序中,有一个包含可扩展RecyclerView的片段,该片段可从Firebase Firestore获取数据,其中的每个项目都有一个按钮,单击该按钮可更改Firestore中影响...的某些数据...

java android android-recyclerview google-cloud-firestore notifydatasetchanged
1个回答
0
投票
U可以在您的适配器中放置一个读取数据的功能,以确保您的数据已更新。我在这里看不到您的适配器的代码,但是请尝试一下,让我知道它是否已解决。
© www.soinside.com 2019 - 2024. All rights reserved.