首页 > 解决方案 > 我在 onclick() 中的值直到下次单击才会显示

问题描述

我想从数据库(firebase实时数据库)中获取一些值并将其用于一些计算或将其显示在a中,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先设置然后真实值,我不知道如何修复它

标签: javaandroidfirebaseonclick

解决方案


在 button.setOnClickListener() 的 onDataChange() 里面添加这些行,而不是在 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();
                    }
                });

推荐阅读