You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:15:03