Android ArrayList洗牌后设置TextView崩溃,求修复建议
修复ClassCastException并优化洗牌逻辑的方案
首先,咱们直接戳中核心问题:你碰到的java.lang.ClassCastException,是因为**TextView.setText()根本不接受ArrayList类型的参数**,你强行把ArrayList转成CharSequence肯定会触发类型转换错误。另外你的洗牌逻辑也有小问题——每次循环加一个元素就洗牌,完全没必要,应该等所有数字都加入集合后再一次性洗牌。
具体修复步骤:
- 调整洗牌时机:把
Collections.shuffle(kocok);移到for循环外面,等所有数字都添加到ArrayList之后再执行洗牌,这样才能得到完整的随机序列。 - 将ArrayList转为字符串:用
String.join()方法把集合里的元素拼接成可读的字符串(比如用逗号分隔),再传给setText(),这才是TextView能识别的参数类型。
修复后的完整代码:
@SuppressLint("SetTextI18n") public void kocokAjah (View view) { TextView textViewCard = findViewById(R.id.textViewCard); relativeLayoutGone.setVisibility(View.INVISIBLE); textViewCard.setVisibility(View.VISIBLE); // 建议添加异常处理,避免输入非数字导致崩溃 try { int MyFirstNumber = Integer.parseInt(editNumBegin.getText().toString()); int MyLastNumber = Integer.parseInt(editNumEnd.getText().toString()); ArrayList<String> kocok = new ArrayList<>(); // 先把所有数字批量加入集合 for (int i = MyFirstNumber; i <= MyLastNumber; i++) { kocok.add(Integer.toString(i)); } // 一次性完成洗牌操作 Collections.shuffle(kocok); // 将集合元素拼接成字符串,用逗号分隔(可根据需求改成换行符"\n") String shuffledText = String.join(", ", kocok); textViewCard.setText(shuffledText); } catch (NumberFormatException e) { // 处理输入无效的情况,给用户明确提示 textViewCard.setText("请输入有效的数字范围!"); e.printStackTrace(); } }
额外优化小建议:
- 可以加个判断,检查
MyFirstNumber是否小于等于MyLastNumber,避免出现循环不执行的空内容情况。 - 如果希望每个数字单独占一行,把
String.join()里的分隔符改成"\n"即可。
内容的提问来源于stack exchange,提问作者Fernando Sinaga
相关产品推荐
相关产品推荐

