Android开发报ClassCastException:String无法转换为AnimeListOne类问题求解
问题原因
你的报错核心是JSON反序列化时类型不匹配,具体触发点在loadData2方法:
你序列化到SharedPreferences的是ArrayList<AnimeListOne>类型的集合,但反序列化时指定的类型是ArrayList<String>,Gson解析后会生成字符串集合,赋值给声明为ArrayList<AnimeListOne>的list变量,后续适配器取元素时就会触发String转AnimeListOne的类型转换异常。
同时你的代码还有逻辑顺序问题:你先往集合中添加新获取的动漫数据,再调用加载本地缓存的loadData2(),会导致刚添加的新数据被本地缓存覆盖。
修复步骤
1. 修正loadData2方法的反序列化类型
把loadData2里的TypeToken泛型从ArrayList<String>改为ArrayList<AnimeListOne>,修改后代码如下:
private void loadData2() { SharedPreferences sp = getActivity().getSharedPreferences("shared preferences", MODE_PRIVATE); Gson gson = new Gson(); String json = sp.getString("anime list", null); // 这里修改泛型为AnimeListOne Type type = new TypeToken<ArrayList<AnimeListOne>>() { }.getType(); list = gson.fromJson(json, type); if (list == null) { list = new ArrayList<AnimeListOne>(); } }
2. 调整数据操作顺序
修改onCreateView里的逻辑,先加载本地缓存,再添加新获取的动漫数据,最后保存,调整后代码片段如下:
// 先加载本地缓存 loadData2(); // 再添加从Intent获取的新动漫数据 Intent intent = getActivity().getIntent(); String animename = intent.getStringExtra("nameanime"); String url = intent.getStringExtra("url2"); // 增加非空判断避免空数据插入 if (animename != null && url != null) { list.add(new AnimeListOne(animename , url)); } // 最后保存更新后的集合 saveData2(); // 再初始化适配器 ListNewAdapter adapter = new ListNewAdapter(getContext(), R.layout.watch_list, list); listv.setAdapter(adapter);
可选优化:适配器减少不必要的对象创建
你的适配器getView方法里不需要每次都新建AnimeListOne对象,直接复用getItem返回的对象即可,优化后代码:
@NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { // 直接拿到已有对象,不需要重复新建 AnimeListOne animeListOne = getItem(position); convertView = LayoutInflater.from(mContext).inflate(R.layout.watch_list,parent, false); TextView tvname = (TextView)convertView.findViewById(R.id.anime_name); ImageView tvurl = (ImageView)convertView.findViewById(R.id.list_photo); tvname.setText(animeListOne.getName()); Glide.with(mContext).load(animeListOne.getUrl()).into(tvurl); return convertView; }
内容的提问来源于stack exchange,提问作者TheVishesh Vlog
相关产品推荐
相关产品推荐

