我想做什么?
[我试图获取数据成员totalPrice
的值在OnItemSelectedListener
之外,该值由函数OnItemSelectedListener
在populate()
内更新。
代码:
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
}
}
您无法在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();
}
}
因此,除非您从下拉列表中选择一些值,否则基本上不会发生该方法。
您实际上是在调用该方法,但是不幸的是,可能会有某种延迟,它可能仅在绘制视图之后才被调用...所以首先您需要在几秒钟后调用该行
使用它来打印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
}
最终修复:
添加了一个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();
}
}