android - 为什么我在 RecyclerView 中的构造函数被调用晚了?
问题描述
我正在为我在 onCreate 中使用 2 个函数的项目创建一个 recyclerView,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cart);
System.out.println("dsdsds");
pref = getSharedPreferences("pref", Context.MODE_PRIVATE);
dbReff = FirebaseDatabase.getInstance().getReference().child("CartItem");
dbToken = FirebaseDatabase.getInstance().getReference().child("TokenNumber");
CreateList();
BuildRecyclerView();
}
在这里,我正在创建一个列表,该列表在第一个函数的适配器中设置,
cartItemArrayList = new ArrayList<>();
dbReff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot data : dataSnapshot.getChildren()) {
if(!data.child("name").getValue().toString().equals("notToDisplayThisItem")) {
cartItemArrayList.add(new CartItemIdQuant(
data.child("id").getValue().toString(),
data.child("quant").getValue().toString(),
data.child("name").getValue().toString(),
data.child("price").getValue().toString()
));
Log.e("THE DATA", data.toString());
}
}
Log.e("INHERE","");
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
第二个功能如下,
recyclerView = findViewById(R.id.recyclerCartView);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
cartAdapter = new CartAdapter(cartItemArrayList);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(cartAdapter);
log.e("Message"," from build recyclerVIew");
我的数据项类如下,
public class CartItemIdQuant {
private String ID;
private String Quant;
private String Name;
private String Price;
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getPrice() {
return Price;
}
public void setPrice(String price) {
Price = price;
}
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public String getQuant() {
return Quant;
}
public void setQuant(String quant) {
Quant = quant;
}
public CartItemIdQuant(String NewID, String NewQuant,String NewName,String NewPrice){
ID = NewID;
Quant = NewQuant;
Name = NewName;
Price = NewPrice;
Log.e("the" , "Method Called From Constructor");
}
public CartItemIdQuant(){
}
}
这里打印了我在第一个函数中接收和打印的数据日志,然后在 2 秒后打印了我在构造函数中打印的日志。我想知道通话延迟的原因,因为我必须延迟它才能正常工作,这是我不想要的。请帮助我,提前谢谢你。
编辑:根据评论,这里是 logcat,在创建列表之前调用来自第二个函数的消息。
2020-02-21 15:20:03.434 547-547/com.chinuEvent.chinuevent E/Message: from build recyclerVIew
2020-02-21 15:20:03.837 547-547/com.chinuEvent.chinuevent E/the: Method Called From Constructor
2020-02-21 15:20:03.838 547-547/com.chinuEvent.chinuevent E/THE DATA: DataSnapshot { key = 02, value = {price=15, name=Orange, id=02, quant=3} }
解决方案
在加载数据之前将适配器设置为视图实际上是完全正常的。在许多情况下(部分)数据是异步加载(或修改)的,您通常希望在这些更新进入时显示这些更新。
为此,您需要做的就是通知适配器其基础数据已更改。然后适配器将通知视图,这些视图将使用更新的数据重新绘制。
要通知适配器,请在修改后notifyDataSetChanged()
在处理程序中调用它:onDataChange
cartItemArrayList
dbReff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot data : dataSnapshot.getChildren()) {
if(!data.child("name").getValue().toString().equals("notToDisplayThisItem")) {
cartItemArrayList.add(new CartItemIdQuant(
data.child("id").getValue().toString(),
data.child("quant").getValue().toString(),
data.child("name").getValue().toString(),
data.child("price").getValue().toString()
));
}
}
cartAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore possible errors
}
});
推荐阅读
- karate - 如何根据条件将值为 Null 的新键添加到动态响应体中
- python - 没有找到 PyJWT<3.0.0,>=2.0.1 的匹配分布
- javascript - 在 useEffect 调用后,React Hooks 改变了 asycn 函数内部数组的状态
- python - 如何在 numba 中使用 numpy 函数
- python - ValueError:您必须指定一个句点或 x 必须是具有 DatetimeIndex 且频率未设置为 None 的 pandas 对象 - decompose() 时间序列
- python - 获取当前 nox 会话的名称
- groovy - Nexus 3 使用 Groovy 脚本创建清理策略
- c++ - 尝试在渲染线程上执行 opengl 调用时,如何摆脱抛出的异常?
- java - 如何在 Java/SWT 中的窗口底部放置标签
- python - 相关矩阵未平方