首页 > 解决方案 > 错误:java.lang.ClassCastException:java.lang.String 无法转换为 com.example.animeguide.AnimeListOne

问题描述

我有一个带有 Imageview 和 Textview 的 gridview。我通过意图获取名称和图像 URL。我想在 textview 中显示名称并在 imageview 中加载 url 但我收到错误“java.lang.ClassCastException: java.lang.String cannot be cast to com.example.animeguide.AnimeListOne”

我的片段

public class NotificationsFragment extends Fragment {
   ArrayList<AnimeListOne> list = new ArrayList<AnimeListOne>();

    GridView listv;

    private NotificationsViewModel notificationsViewModel;
    private FragmentNotificationsBinding binding;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        notificationsViewModel =
                new ViewModelProvider(this).get(NotificationsViewModel.class);

        binding = FragmentNotificationsBinding.inflate(inflater, container, false);
        View root = binding.getRoot();


        listv = root.findViewById(R.id.listv);

        Intent intent = getActivity().getIntent();
        String animename = intent.getStringExtra("nameanime");

        Intent newintent = getActivity().getIntent();
        String url = newintent.getStringExtra("url2");


        list.add(new AnimeListOne(animename , url));


        loadData2();
        saveData2();

        ListNewAdapter adapter = new ListNewAdapter(getContext(), R.layout.watch_list, list);
        listv.setAdapter(adapter);

        listv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                list.remove(position);
                adapter.notifyDataSetChanged();
                saveData2();
                return true;
            }
        });



    return  root; }

    private void saveData2() {
        SharedPreferences sp = getActivity().getSharedPreferences("shared preferences", MODE_PRIVATE);
        SharedPreferences.Editor ed = sp.edit();
        Gson gson = new Gson();
        String json = gson.toJson(list);
        ed.putString("anime list", json);
        ed.apply();
    }

    private void loadData2() {
        SharedPreferences sp = getActivity().getSharedPreferences("shared preferences", MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sp.getString("anime list", null);
        Type type = new TypeToken<ArrayList<String>>() {
        }.getType();
        list = gson.fromJson(json, type);

        if (list == null) {
            list = new ArrayList<AnimeListOne>();
        }

    }







@Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;

}
}
'''

我的适配器类

public class ListNewAdapter extends ArrayAdapter<AnimeListOne> {
    private Context mContext;
    public ListNewAdapter(@NonNull @NotNull Context context, int resource, @NonNull @NotNull ArrayList<AnimeListOne> objects) {
        super(context, resource, objects);
        mContext = context;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
       String name = getItem(position).getName();
       String url = getItem(position).getUrl();

       AnimeListOne animeListOne = new AnimeListOne(name , url);
        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(name);
        Glide.with(mContext).load(url).into(tvurl);
        return convertView;
    }
}

'''

动漫列表一类

public class AnimeListOne {
    private String name;
    private String url;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public AnimeListOne(String name, String url) {
        this.name = name;
        this.url = url;
    }
}

标签: javaandroidandroid-studiolistviewlistadapter

解决方案


检查这一行:

Type type = new TypeToken<ArrayList<String>>() {}.getType();

尝试这个:

 Type type = new TypeToken<ArrayList<AnimeListOne>>() {}.getType();

推荐阅读