Đợi cho đến khi firebase truy xuất dữ liệu trong android

Mình đang gặp 1 vấn đề chưa biết xử lý sao là : Mình có gọi dữ liệu từ firebase rồi mới return view ra , nhưng vấn đề là khi return view thì dữ liệu mới được trả về . mọi người có thể cho mình hướng giải quyết được không ạ . Cho mình hỏi có cách nào để lấy dữ liệu rồi mới return view không ạ =.=
OnCreateview ở Fragment

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        mView = inflater.inflate(R.layout.fragment_product, container, false);
        rcvProduct = mView.findViewById(R.id.rcv_product);
        mainActivity = (MainActivity) getActivity();
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mainActivity);
        rcvProduct.setLayoutManager(linearLayoutManager);
        productAdapter = new ProductAdapter();
        productAdapter.setData(getListProdcut())
        rcvProduct.setAdapter(productAdapter);
        return mView;
    }

Lấy dữ liệu
GetListProduct

     private List<Product> getListProdcut() {
            List<Product> list = new ArrayList<>();
            myRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                        Product1 product1Obj = postSnapshot.getValue(Product1.class);

                        list.add(new Product(R.drawable.img2, product1Obj.getNameProduct(), product1Obj.getDescriptionProcduct()));
                       
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {
                    System.out.println("failed");

                }
            });
          return list;
    }

Xử lý bất đồng bộ bạn à.
Ý định của bạn là lấy được dữ liệu rồi mới return mView. Điều này không nên, sẽ gây đứng ứng dụng (dân gian gọi là “đơ”) nếu thao tác dữ liệu lâu.
Bạn cứ thao tác xong phần OnCreateView đi.
Sau đó gọi đến getListProduct (Product, không phải Prodcut), bên trong sự kiện onDataChange mới gọi đến productAdapter.setData(list);.
Tuy nhiên, có thể sự kiện onDataChange nằm trên luồng (thread) khác, để tránh xung đột luồng, bạn nên để productAdapter.setData(list); vào productAdapter.post.

3 Likes

Ồ cảm ơn b nhé. mình đã xử lý theo cách của b và thành công :blush:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?