首页 > 解决方案 > 为什么我在 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} }

标签: androidfirebasefirebase-realtime-databaseandroid-recyclerview

解决方案


在加载数据之前将适配器设置为视图实际上是完全正常的。在许多情况下(部分)数据是异步加载(或修改)的,您通常希望在这些更新进入时显示这些更新。

为此,您需要做的就是通知适配器其基础数据已更改。然后适配器将通知视图,这些视图将使用更新的数据重新绘制。

要通知适配器,请在修改后notifyDataSetChanged()在处理程序中调用它:onDataChangecartItemArrayList

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
    }
});

推荐阅读