如何获取setOnItemSelectedListener之外的变量的更新值?

问题描述 投票:0回答:3

我想做什么?

[我试图获取数据成员totalPrice的值在OnItemSelectedListener之外,该值由函数OnItemSelectedListenerpopulate()内更新。

代码:

MainActivity

public class MainActivity extends AppCompatActivity {

   private double totalPrice;
   private void populate(){
      // some private code
      totalPrice += 10; // this shows the updated value
   }

   private void initSpinner(){

      Spinner date = findViewById(R.id.Date);

      ArrayList<String> dateContent = new ArrayList<>();
      dateContent.add("2020-06");
      dateContent.add("2020-05");

      ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.date_layout, R.id.dateItem, dateContent);
      date.setAdapter(adapter);

      date.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
          @Override
          public void onItemSelected(AdapterView adapter, View view, int i, long lng){
              for (int idx = 0; idx < 5; idx++)
                  populate();
          }
          @Override
          public void onNothingSelected(AdapterView<?> parentView){ }
      });
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      initSpinner();
      System.out.println("Total: "+totalPrice); // this doesn't show updated value
  }
}
java android
3个回答
0
投票

您无法在onCreate中获取更新的值,因为在创建活动时,该值仅调用一次。要获取最新值,您可以尝试此]

public class MainActivity extends AppCompatActivity {

   private double totalPrice;
   private void populate(){
      // some private code
      totalPrice += 10; // this shows the updated value
      System.out.println("Total: "+totalPrice); 
   }

   private void initSpinner(){

      Spinner date = findViewById(R.id.Date);

      ArrayList<String> dateContent = new ArrayList<>();
      dateContent.add("2020-06");
      dateContent.add("2020-05");

      ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.date_layout, R.id.dateItem, dateContent);
      date.setAdapter(adapter);

      date.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
          @Override
          public void onItemSelected(AdapterView adapter, View view, int i, long lng){
              for (int idx = 0; idx < 5; idx++)
                  populate();
          }
          @Override
          public void onNothingSelected(AdapterView<?> parentView){ }
      });
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      initSpinner();

  }
}

0
投票

因此,除非您从下拉列表中选择一些值,否则基本上不会发生该方法。

您实际上是在调用该方法,但是不幸的是,可能会有某种延迟,它可能仅在绘制视图之后才被调用...所以首先您需要在几秒钟后调用该行

使用它来打印onCreate中的值

 @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      initSpinner();
      new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.d("Output","TotalPrice : "+totalPrice);
            }
        },500); // it causes half second delay

  }

0
投票

最终修复:

添加了一个TextView并在setOnItemSelectedListener中设置其值。

MainActivity

public class MainActivity extends AppCompatActivity {

    private double totalPrice;
    private TextView total;
    private void populate(){
        // some private code
        totalPrice += 10;
    }
    private void setTotal(double newTotal){
       total.setText("Total: "+newTotal);
    }

    private void initSpinner(){

        Spinner date = findViewById(R.id.Date);

        ArrayList<String> dateContent = new ArrayList<>();
        dateContent.add("2020-06");
        dateContent.add("2020-05");

        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.date_layout, R.id.dateItem, dateContent);
        date.setAdapter(adapter);

        date.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
            @Override
            public void onItemSelected(AdapterView adapter, View view, int i, long lng){
                for (int idx = 0; idx < 5; idx++)
                   populate();
                setTotal(totalPrice);
            }
            @Override
            public void onNothingSelected(AdapterView<?> parentView){ }
       });
   }

   private void initTotal(){
      total = findViewById(R.id.Total);
   }

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      initTotal();
      initSpinner();
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.