Android开发:无法在两个Activity间传递ArrayList<Double>
解决ArrayList在Activity间传递的类型不兼容问题
嘿,我一眼就瞅出问题所在啦!你在两个Activity里用了不匹配的传递/获取方式,直接导致了类型错误,我帮你一步步修正,顺便还会指出代码里的其他小疏漏~
问题根源
你在Activity1中传递的是**ArrayList<Double>对象**,但在Activity2里却用getDoubleArrayExtra("winnings")去获取——这个方法返回的是double[](基本类型数组),和ArrayList<Double>完全是两种类型,自然会报“类型不兼容”的错误。
解决方案:正确传递&获取ArrayList
因为ArrayList<Double>实现了Serializable接口,所以可以直接通过Intent传递,只需要修改Activity2的获取逻辑即可:
修正后的Activity2代码
public class SummaryActivity extends AppCompatActivity { ArrayList<Double> winnings = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_summary); setTitle("Summary"); // 注意:你这里重复定义了lblAverage,我帮你修正了变量名对应正确的TextView TextView lblTournaments = (TextView) findViewById(R.id.txtTournaments); TextView lblTotal = (TextView) findViewById(R.id.txtTotal); TextView lblMax = (TextView) findViewById(R.id.txtMax); TextView lblMin = (TextView) findViewById(R.id.txtMin); TextView lblAverage = (TextView) findViewById(R.id.txtAverage); Intent i = getIntent(); // 用getSerializableExtra获取,注意强制类型转换 @SuppressWarnings("unchecked") ArrayList<Double> receivedWinnings = (ArrayList<Double>) i.getSerializableExtra("winnings"); if(receivedWinnings != null) { winnings = receivedWinnings; } // 这里可以继续写求和、计算最大最小等逻辑 // 比如计算总和: double total = 0; for(double win : winnings) { total += win; } lblTotal.setText("Total: " + total); } }
额外修正:Activity1里的小bug
你在btnClear_OnClick方法里的判断条件错了:集合的size()永远不会小于0,应该判断是否为0:
public void btnClear_OnClick(View v) { // 把 winnings.size() < 0 改成 winnings.size() == 0 if(winnings.size() == 0) { displayToast("You have no winnings to clear"); }else { winnings.clear(); displayToast("Cleared"); } }
另一种可选方案:转成double数组传递
如果你更倾向于用数组传递,也可以这么做:
- 在Activity1传递时,把ArrayList转成double数组:
// 把ArrayList转成double数组 double[] winningsArray = new double[winnings.size()]; for(int j=0; j<winnings.size(); j++){ winningsArray[j] = winnings.get(j); } i.putExtra("winnings", winningsArray);
- 在Activity2里获取数组,再转成ArrayList:
double[] winningsArray = i.getDoubleArrayExtra("winnings"); if(winningsArray != null) { winnings = new ArrayList<>(Arrays.asList(Arrays.stream(winningsArray).boxed().toArray(Double[]::new))); }
不过第一种方案更直接,适合新手使用~
内容的提问来源于stack exchange,提问作者Mark Riley
相关产品推荐
相关产品推荐

