Почему мой конструктор в RecyclerView вызывается поздно? - PullRequest
0 голосов
/ 21 февраля 2020

Я создаю recyclerView для своего проекта, для которого я использую 2 функции в onCreate,

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

и 2-я функция следующая:

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(){

    }
}

здесь журнал данных, которые я получаю и print в 1-й функции печатается, а журнал, который я печатаю в конструкторе, затем печатается через 2 секунды. Я хочу знать причину задержки в вызове, так как я должен поставить задержку для его правильной работы, чего я не хочу. Пожалуйста, помогите мне, спасибо заранее.

РЕДАКТИРОВАТЬ: здесь, согласно комментарию, есть logcat, в котором вызывается сообщение от 2-й функции до того, как список может быть создан.

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

1 Ответ

0 голосов
/ 21 февраля 2020

На самом деле совершенно нормально установить адаптер на представление до загрузки данных. Во многих случаях (в некоторых случаях) данные загружаются (или изменяются) асинхронно, и вам часто нужно показывать эти обновления по мере их поступления.

Все, что вам нужно для этого сделать, - уведомить адаптер о том, что его базовые данные изменились. Затем адаптер уведомит представления, и они будут перекрашены с обновленными данными.

Чтобы уведомить адаптер, вызовите его 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
    }
});
...