мои значения внутри onclick () не отображаются до следующего клика - PullRequest
0 голосов
/ 13 апреля 2019

Я хочу взять некоторые значения из базы данных (база данных реального времени firebase) и использовать их с некоторыми вычислениями или отобразить их в TextView, но когда пользователь нажимает кнопку, мое приложение не получает значение до следующего щелчкасо всеми моими методами, с петлей или нет.вне метода onClick() я могу получить значения просто отлично.Это код для получения данных из базы данных и отображения их в виде TextView внутри onClick()

DatabaseReference myRef;
private double avgrate;
private String category;

private Button button;
private Spinner categories;
private TextView ratetxt;

protected void onCreate(Bundle savedInstanceState) {
    myRef = FirebaseDatabase.getInstance().getReference("user_account");

    //initialize
    avgrate = 0.0;
    button = (Button) findViewById(R.id.button);
    ratetxt = (TextView) findViewById(R.id.ratetxt);
    ratetxt.setVisibility(View.GONE);

    // for category adapter -- it works
    myRef.child("(username)").child("category").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            final List<String> propertyAddressList = new ArrayList<String>();
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                String propertyAddress = ds.getKey();
                if (propertyAddress != null) {
                    propertyAddressList.add(propertyAddress);
                    for (DataSnapshot ds2 : dataSnapshot.child(propertyAddress).getChildren()) {
                        String sub = (String) ds2.getValue();
                        if (sub != null && !sub.contains("null")) {
                            propertyAddressList.add(sub);
                        }
                    }
                }
            }
            categories = (Spinner) findViewById(R.id.categ);
            ArrayAdapter<String> addressAdapter = new ArrayAdapter<String>(myactivity.this, android.R.layout.simple_spinner_item, propertyAddressList);
            addressAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            categories.setAdapter(addressAdapter);
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_SHORT).show();
        }
    });

    // ON CLICK
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            category = categories.getSelectedItem().toString();

            if (category.isEmpty()) {
                    Toast.makeText(getApplicationContext(), "ERROR - CHOOSE CATEGORY", Toast.LENGTH_SHORT).show();
                } else {

                    // take average rating -- HERE IS THE PROBLEM

                    myRef.child("(username)").child("rating").child(category).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                                String str = (String) dataSnapshot.child("avg").getValue(String.class);
                                if (str != null) {
                                    avgrate = Double.parseDouble(str);
                                }
                            }
                        }
                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_SHORT).show();
                        }
                    });

                    ratetxt.setVisibility(View.VISIBLE);
                    ratetxt.setText("AVG. RATE: "+avgrate+"");

    }/*close else*/ }});// End of OnClick()
} // END OF OnCreate()

. Вот код, в котором мне нужно взять средний рейтинг для выбранной категории и установить егов текстовом представлении, при первом нажатии кнопки avg.в следующий раз будет 0.0, и будет установлено реальное значение; если я его не инициализирую, сначала будет установлено null, затем реальное значение, я не знаю, как это исправить

1 Ответ

0 голосов
/ 13 апреля 2019

Добавьте эти строки внутри onDataChange () в button.setOnClickListener () Вместо записи вне onDataChange ()

            ratetxt.setVisibility(View.VISIBLE);
            ratetxt.setText("AVG. RATE: "+avgrate+"");

Ниже приведены коды после внесения изменений. Надеюсь, что это поможет.

                myRef.child("(username)").child("rating").child(category).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for (DataSnapshot ds : dataSnapshot.getChildren()) {
                            String str = (String) dataSnapshot.child("avg").getValue(String.class);
                            if (str != null) {
                                avgrate = Double.parseDouble(str);
                                ratetxt.setVisibility(View.VISIBLE);
                                ratetxt.setText("AVG. RATE: "+avgrate+"");
                            }
                        }
                    }
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_SHORT).show();
                    }
                });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...