我如何保证获取数据是我 activity 中的第一个操作
How can I guarantee that fetching data is the first action in my activity
我在我的 Android 项目 Firebase Firestore 中使用,在我的一项活动中,我必须获取数据并将其保存在列表中,以便计算一些东西。问题是,无论我把获取数据的代码放在哪里,这个动作总是最后一个(在 Logcat 中查找)。因此,当我尝试计算时,我的列表总是空的。我如何设法先检索数据然后继续该过程?有谁知道为什么它总是最后完成的过程?
抱歉,有一些葡萄牙语单词,但不是很重要
private List<Painel> paineis = new ArrayList<>();
private List<Inversor> inversores = new ArrayList<>();
FirebaseFirestore paineisBD = FirebaseFirestore.getInstance();
FirebaseFirestore inversoresBD = FirebaseFirestore.getInstance();
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
LoadData();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.dim_resultado_card_fragment, container, false);
Calculate();
recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true); //para o tamanho do recycleview não mudar
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
Adapter_Produtos adapter = (Adapter_Produtos) recyclerView.getAdapter();
if (produtosList.size() == linearLayoutManager.findLastCompletelyVisibleItemPosition() + 1) {
//List<Produtos_Class> listAux = ((MainActivity) getActivity().getSetCarList(10));
List<Produtos_Class> listAux = new ArrayList<>();
for (int i = 0; i < listAux.size(); i++) {
adapter.addListItem(listAux.get(i), produtosList.size());
}
}
}
});
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); //Deixar scroolView padrão
recyclerView.setLayoutManager(linearLayoutManager);
adapter = new Adapter_Produtos(produtosList);
adapter.setRecyclerViewOnClick(this);
Collections.sort(produtosList, Produtos_Class.menor_valor);
recyclerView.setAdapter(adapter);
return view;
}
private void LoadData() {
paineisBD.collection("paineis").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
Log.d("PAINEIS", "ID: " + document.getId() + " => " + document.getData());
paineis.add(new Painel((document.getId()),
document.getBoolean("disponivel"),
document.getDouble("ef"),
document.getString("empresa"),
document.getString("marca"),
document.getDouble("larg"),
document.getDouble("alt"),
document.getString("link"),
document.getDouble("pot"),
document.getDouble("valor")));
}
} else {
Log.d("PAINEIS", "Error getting documents", task.getException());
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getContext(), "Error Painel" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
inversoresBD.collection("inversores").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
inversores.add(new Inversor((document.getId()),
document.getDouble("alt"),
document.getDouble("larg"),
document.getDouble("ef"),
document.getDouble("potencia"),
document.getString("marca"),
document.getString("empresa"),
document.getString("link"),
document.getBoolean("disponivel")));
Log.d("INVERSORES", "ID:" + document.getId() + " => " + document.getData(), task.getException());
}
} else {
Log.d("INVERSORES", "Error getting documents", task.getException());
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getContext(), "Error Inversor" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
// When I check my two List here their empty
public void Calculate() {
// Nothing relevant
}
Does anyone know why it is always the last process done?
因为它是异步完成的,您会延迟收到响应。您应该 calculate
in onComplete
作为此方法在 for 循环之后的最后一行,以确保列表包含元素
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
inversores.add(new Inversor((document.getId()),
document.getDouble("alt"),
document.getDouble("larg"),
document.getDouble("ef"),
document.getDouble("potencia"),
document.getString("marca"),
document.getString("empresa"),
document.getString("link"),
document.getBoolean("disponivel")));
Log.d("INVERSORES", "ID:" + document.getId() + " => " + document.getData(), task.getException());
}
calculate(); // call the mothod to calculate;
} else {
Log.d("INVERSORES", "Error getting documents", task.getException());
}
}
我在我的 Android 项目 Firebase Firestore 中使用,在我的一项活动中,我必须获取数据并将其保存在列表中,以便计算一些东西。问题是,无论我把获取数据的代码放在哪里,这个动作总是最后一个(在 Logcat 中查找)。因此,当我尝试计算时,我的列表总是空的。我如何设法先检索数据然后继续该过程?有谁知道为什么它总是最后完成的过程?
抱歉,有一些葡萄牙语单词,但不是很重要
private List<Painel> paineis = new ArrayList<>();
private List<Inversor> inversores = new ArrayList<>();
FirebaseFirestore paineisBD = FirebaseFirestore.getInstance();
FirebaseFirestore inversoresBD = FirebaseFirestore.getInstance();
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
LoadData();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.dim_resultado_card_fragment, container, false);
Calculate();
recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true); //para o tamanho do recycleview não mudar
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
Adapter_Produtos adapter = (Adapter_Produtos) recyclerView.getAdapter();
if (produtosList.size() == linearLayoutManager.findLastCompletelyVisibleItemPosition() + 1) {
//List<Produtos_Class> listAux = ((MainActivity) getActivity().getSetCarList(10));
List<Produtos_Class> listAux = new ArrayList<>();
for (int i = 0; i < listAux.size(); i++) {
adapter.addListItem(listAux.get(i), produtosList.size());
}
}
}
});
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); //Deixar scroolView padrão
recyclerView.setLayoutManager(linearLayoutManager);
adapter = new Adapter_Produtos(produtosList);
adapter.setRecyclerViewOnClick(this);
Collections.sort(produtosList, Produtos_Class.menor_valor);
recyclerView.setAdapter(adapter);
return view;
}
private void LoadData() {
paineisBD.collection("paineis").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
Log.d("PAINEIS", "ID: " + document.getId() + " => " + document.getData());
paineis.add(new Painel((document.getId()),
document.getBoolean("disponivel"),
document.getDouble("ef"),
document.getString("empresa"),
document.getString("marca"),
document.getDouble("larg"),
document.getDouble("alt"),
document.getString("link"),
document.getDouble("pot"),
document.getDouble("valor")));
}
} else {
Log.d("PAINEIS", "Error getting documents", task.getException());
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getContext(), "Error Painel" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
inversoresBD.collection("inversores").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
inversores.add(new Inversor((document.getId()),
document.getDouble("alt"),
document.getDouble("larg"),
document.getDouble("ef"),
document.getDouble("potencia"),
document.getString("marca"),
document.getString("empresa"),
document.getString("link"),
document.getBoolean("disponivel")));
Log.d("INVERSORES", "ID:" + document.getId() + " => " + document.getData(), task.getException());
}
} else {
Log.d("INVERSORES", "Error getting documents", task.getException());
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getContext(), "Error Inversor" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
// When I check my two List here their empty
public void Calculate() {
// Nothing relevant
}
Does anyone know why it is always the last process done?
因为它是异步完成的,您会延迟收到响应。您应该 calculate
in onComplete
作为此方法在 for 循环之后的最后一行,以确保列表包含元素
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
inversores.add(new Inversor((document.getId()),
document.getDouble("alt"),
document.getDouble("larg"),
document.getDouble("ef"),
document.getDouble("potencia"),
document.getString("marca"),
document.getString("empresa"),
document.getString("link"),
document.getBoolean("disponivel")));
Log.d("INVERSORES", "ID:" + document.getId() + " => " + document.getData(), task.getException());
}
calculate(); // call the mothod to calculate;
} else {
Log.d("INVERSORES", "Error getting documents", task.getException());
}
}