Как получить / обработать синхронизированные данные Firestore, имеющие несколько записей? - PullRequest
0 голосов
/ 04 октября 2019

Нужно сделать:
В основном я хочу Firestore => коллекция "order" => документы, имеющие customerid и productid для каждого документа => onSuccess => добавить в OrderPOJOList=> вызвать getCustomerName (), затем getProductName () => получить имена в порядке => добавить в соответствующий ArrayList => в конце объединить все данные из трех массивов (OrderPOJOList, CustomerName, ProductName) to CurrentOrderPOJOList => установлен в Adapter.

Проблема: два слушателя в getCustomerName () и getProductName () работают асинхронно и добавляютИмя arrayList случайным образом ... все, что я хочу, - это отображать данные на адаптере в порядке , но иногда имена получают обмен по списку из-за асинхронной работы списков.

Что я должен сделать, чтобы последовательно отображать имена моих клиентов и продуктов из пожарного магазина?

public class CurrentOrders extends AppCompatActivity {
    private List<CurrentOrdersPOJO> currentOrdersPOJOList;
    private List<OrderPOJO> orderPOJOList;
    private FirebaseFirestore firebaseFirestore;
    private String DocId, Area, cname, pname;
    private OrderPOJO orderPOJO;
    private CurrentOrdersPOJO currentOrdersPOJO;
    private int count = -1, count1 = -1, i;
    private RecyclerView recyclerView;
    private List<String> customerName, productName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_current_orders);

        //Current User Unique ID
        DocId = getIntent().getStringExtra("DocumentId");
        Area = getIntent().getStringExtra("Area");
        Log.w("ReachedCurrentOrders", "Doc Id: " + DocId + "\nArea: " + Area);

        currentOrdersPOJOList = new ArrayList<>();
        customerName = new ArrayList<String>();
        productName = new ArrayList<String>();
        orderPOJOList = new ArrayList<>();

        recyclerView = findViewById(R.id.activity_current_order_recyclerView);
        firebaseFirestore = FirebaseFirestore.getInstance();

        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));

        firebaseFirestore.collection("order")
                .whereEqualTo("area", Area)
                .whereEqualTo("status", "active")
                .get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(final QuerySnapshot queryDocumentSnapshots) {
                        if (!queryDocumentSnapshots.isEmpty()) {

                            for (final QueryDocumentSnapshot queryDocumentSnapshot : queryDocumentSnapshots) {
                                count++;
                            }

                            for (final QueryDocumentSnapshot queryDocumentSnapshot : queryDocumentSnapshots) {

                                orderPOJO = queryDocumentSnapshot.toObject(OrderPOJO.class);
                                orderPOJOList.add(orderPOJO);

                                Log.d("Tagging", "The Customer UID: " + orderPOJO.getC_uid() + "\nThe Product Doc ID: " + orderPOJO.getP_docid());

                                count1++;

                                if (count == count1) {
                                    getCustomerName();
                                }

                            }//endof for loop

                        } else {
                            Toast.makeText(CurrentOrders.this, "No Orders in Your Area", Toast.LENGTH_SHORT).show();
                            Log.d("CurrentOrder", "Exception Here");
                        }

                    }

                });
    }//endofOnCreate

    public void getCustomerName() {
        count1 = -1;
        //Getting Customer Name from ID
        for (i = 0; i <= count; i++) {
            firebaseFirestore.collection("customer").document(orderPOJOList.get(i).getC_uid()).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                @Override
                public void onSuccess(DocumentSnapshot documentSnapshot) {
                    if (documentSnapshot.exists()) {

                        cname = documentSnapshot.getString("name");
                        customerName.add(cname);

                        count1++;

                        if (count1 == count) {
                            getProductName();
                        }

                    } else {
                        Log.d("CurrentOrders", "Exception Here" + documentSnapshot.exists());
                    }
                }
            });
        }
    }//end of function

    public void getProductName() {
        count1 = -1;
        //Product Getting Name
        for (i = 0; i <= count; i++) {
            firebaseFirestore.collection("product").document(orderPOJOList.get(i).getP_docid()).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                @Override
                public void onSuccess(DocumentSnapshot documentSnapshot) {
                    if (documentSnapshot.exists()) {
                        pname = documentSnapshot.getString("name");
                        productName.add(pname);

                        count1++;

                        if (count1 == count) {
                            callAdapter();
                        }
                    } else {
                        Log.d("CurrentOrders", "Exception Here" + documentSnapshot.exists());
                    }
                }

            });
        }
    }//endofFunction

    public void callAdapter() {
        for (int i = 0; i <= count; i++) {

            currentOrdersPOJO = new CurrentOrdersPOJO(customerName.get(i), orderPOJOList.get(i).getComplete_address(),
                    productName.get(i), orderPOJOList.get(i).getQuantity(), orderPOJOList.get(i).getStatus(), orderPOJOList.get(i).getArea(), orderPOJOList.get(i).getO_date());

            currentOrdersPOJOList.add(currentOrdersPOJO);
        }
        recyclerView.setAdapter(new CurrentOrdersAdapter(currentOrdersPOJOList, CurrentOrders.this));
    }//endofFunction

}//endofclass

[снимок экрана со списком действий, который меняется каждый раз] [1]

  [1]: https://i.stack.imgur.com/X48JF.jpg

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Аналогичный вопрос был задан в другом потоке , кажется, что вы можете синхронно возвращать данные, потому что сам метод является задачей, вы можете попробовать использовать метод Taks.await (задача) для ожиданиядля завершения операции, возможно, это ответ, который вы ищете.

0 голосов
/ 24 октября 2019

Я решил эту проблему, используя упомянутое решение с помощью @Ricardo, описанного выше, и объединил решение с использованием Asynctask (фоновый поток), так как он сначала выдавал IllegalStateException из-за вызова Tasks.await (задача) в главном потоке пользовательского интерфейса.

Итак, используйте: Tasks.await (задание) в Aysnctask (фоновый поток)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...