【问题标题】:How to resolve ClassCastException: java.lang.String cannot be cast exception如何解决 ClassCastException: java.lang.String cannot be cast 异常
【发布时间】:2018-06-22 14:32:12
【问题描述】:

我需要帮助。我有两种共享偏好的方法。它们是 getList 和 setList。

这是 setList()

 public static void setList(Application activity, List<tcmb> mValuesList) {

        StringBuilder valuesBuilder = new StringBuilder();
        /*Log.d(TAG, "List Size ------ \t: " + mValuesList.size());*/
        for (tcmb s : mValuesList) {
            valuesBuilder.append(s);
            valuesBuilder.append(",");
            Log.d(TAG, "setValuestcmb: " + valuesBuilder.toString());
        }
        SharedPreferences values = activity.getSharedPreferences("dd", MODE_PRIVATE);
        SharedPreferences.Editor editor = values.edit();
        editor.putString("ss", valuesBuilder.toString());
        editor.apply();
    }

这是 getList()

public static List<tcmb> getList(Activity a) {
        SharedPreferences values = a.getSharedPreferences("dd", MODE_PRIVATE);
        String wordsString = values.getString("ss", "");
       /* Log.d(TAG, "wordsString \t:" + wordsString);*/
       String[] itemWords = wordsString.split(",");
       List<String> itemList = new ArrayList<String>();
       itemList.addAll(Arrays.asList(itemWords));
        dovizList = (List)itemsList;
        Log.d(TAG, "getValuestcmb: " + dovizList.size());

        return dovizList;

    }

对于我得到的值,我在分配给共享首选项的 Main Activity 的 asyncTask 类中运行 setList 方法。 然后为了获取值,我在 Fragment 的 asyncTask 类中运行 getList 方法。 我得到了对象值。也就是说,我可以看到我从 logcat 中得到的值。

[com.example.lscodex.ddddd.Model.tcmb@4ff695, com.example.lscodex.ddddd.Model.tcmb@b6b93aa, com.example.lscodex.ddddd.Model.tcmb@347db9b, com.example.lscodex.ddddd.Model.tcmb@f63eb38, com.example.lscodex.ddddd.Model.tcmb@4866711, com.example.lscodex.ddddd.Model.tcmb@8c74076, com.example.lscodex.ddddd.Model.tcmb@3be9677, com.example.lscodex.ddddd.Model.tcmb@10882e4, com.example.lscodex.ddddd.Model.tcmb@8d9634d, com.example.lscodex.ddddd.Model.tcmb@b5eee02, com.example.lscodex.ddddd.Model.tcmb@b7c2313, com.example.lscodex.ddddd.Model.tcmb@a3ce950, com.example.lscodex.ddddd.Model.tcmb@ee5e749, com.example.lscodex.ddddd.Model.tcmb@fd1e84e, com.example.lscodex.ddddd.Model.tcmb@b7bdd6f, com.example.lscodex.ddddd.Model.tcmb@40f4a7c, com.example.lscodex.ddddd.Model.tcmb@b1caf05, com.example.lscodex.ddddd.Model.tcmb@b683b5a, com.example.lscodex.ddddd.Model.tcmb@f12e18b]

共有 19 个值。 但是当我在片段类中将值转换为 recylerView 的 bindHolder 时,我得到一个错误是

java.lang.ClassCastException: java.lang.String cannot be cast to com.example.lscodex.ddddd.Model.tcmb

这是来自片段的异步任务

private class DownloadXmlTask extends AsyncTask<Void, Integer, List<tcmb>> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressBar.setVisibility(View.VISIBLE);
        }

        @Override
        protected List<tcmb> doInBackground(Void... voids) {

           return SharedPreferenceValues.getList(getActivity());
        }

        @Override
        protected void onPostExecute(List<tcmb> tcmb) {
            if (tcmb.size() == 0) {

                mtcmbList = tcmb;
                setupAdapter();

                mRecyclerViewAnim.runLayoutAnimation(getContext(), mRecyclerView);
                mProgressBar.setVisibility(View.INVISIBLE);

            } else if (mRecyclerView != null) {

                mtcmbList.addAll(tcmb);
                Log.d(TAG, "onPostExecute: " + mtcmbList.size());
                mRecyclerView.getAdapter().notifyDataSetChanged();
                dateUpdate();

                mRecyclerViewAnim.runLayoutAnimation(getContext(), mRecyclerView);
                mProgressBar.setVisibility(View.INVISIBLE);
                mSwipeRefreshLayout.setRefreshing(false);
            }
        }

    }

以及我得到错误的地方。

 @Override
        public void onBindViewHolder(tcmbHolder holder, int position) {
            tcmb tcmb= mtcmbList.get(position); ---- the error here
            holder.bindTcmb(tcmb);

我不知道为什么?

编辑

我尝试使用共享首选项,从初始屏幕获取 XML 列表数据并将其导入其他活动。

 private class splashTask extends AsyncTask<Void, Integer, List<tcmb>> {

        private Activity mContext;

        public splashTask(Activity c){
            this.mContext = c;
        }


        @Override
        protected void onPreExecute() {
            mSplashProgressBar.setProgress(0);
        }

        @Override
        protected List<tcmbDoviz> doInBackground(Void... voids) {
            List<tcmb> tcmbList =  new ConnectionXmlParser().getXmlFile(getApplicationContext());
            try {


                int getvalues = ConnectionXmlParser.howLong();
                Log.d(TAG, "doInBackground: " +getvalues);
                for (int i=0;i<getvalues;i++){
                    Log.d(TAG, "doInBackground: " +i);
                    publishProgress(((int)i*100)/getvalues);

                    Log.d(TAG, "Publishing "  + ((int)i*100/getvalues));

                }
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            return tcmbList;
        }

        @Override
        protected void onPostExecute(List<tcmbDoviz> list) {
            mtcmbList.addAll(list);

            SharedPreferenceValues.setValuesList(getApplication(),mtcmbList);
            splashScreen();
            mSplashProgressBar.setVisibility(View.GONE);
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            mSplashProgressBar.setProgress(values[0]);
            super.onProgressUpdate(values);
        }

【问题讨论】:

    标签: java android string list classcastexception


    【解决方案1】:

    您正在尝试将List&lt;String&gt; 更改为List&lt;tcmb&gt;,问题就在这里

    public static List<tcmb> getList(Activity a){
    
        // your code
        // 
    
        List<String> itemList = new ArrayList<String>();
        itemList.addAll(Arrays.asList(itemWords));
        dovizList = (List)itemsList;
        Log.d(TAG, "getValuestcmb: " + dovizList.size());
    
        return dovizList;
    

    另外,我不明白你到底想在这里实现什么。

    List<String> itemsList = new ArrayList<String>();
    dovizList = (List)itemsList;
    

    但是,根据共享的代码,您需要更改

    List<String> itemsList = new ArrayList<String>();
    

    List<tcmb> itemsList = new ArrayList<tcmb>();
    

    而且,你不需要

    dovizList = (List)itemsList;
    

    【讨论】:

    • 我打错了你不明白的那一行,对不起。我编辑了,但是谢谢你的帮助。
    • @lscodex 我没听懂你??你能具体点你在说什么吗??哪一行?
    • 这一行 -> List itemsList = new ArrayList();我写了两次。
    • 我不太清楚,但我取了列表的值,我在 logcat 上看到了。我从列表中得到的值是setValues中的字符串值。我正在将它们转移到 getValuesList() 中的 tcmb 对象列表。
    • @lscodex 没有这个方法,你的意思是getValuesList?不,该方法不会传输任何内容。
    【解决方案2】:

    我找到了方法。

    在splashscreen.activity中保存带有共享首选项的XML列表对象

     public static void setValues(Context context, List<tcmb> curProduct){
            Gson gson = new Gson();
            String jsonCurProduct = gson.toJson(curProduct);
    
            SharedPreferences sharedPref = context.getSharedPreferences("Prefs", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPref.edit();
    
            editor.putString("dd", jsonCurProduct);
            editor.apply();
            Log.d(TAG, "setValues: " + jsonCurProduct);
        }
    

    然后,在片段中获取具有 Shared Preferences 的 List 对象

    public static List<tcmb> getValuesAltın(Context context){
            Gson gson = new Gson();
            List<tcmbDoviz> productFromShared = new ArrayList<>();
            SharedPreferences sharedPref = context.getSharedPreferences("Prefs", Context.MODE_PRIVATE);
            String jsonPreferences = sharedPref.getString("dd", "");
    
            Type type = new TypeToken<List<tcmb>>() {}.getType();
            productFromShared = gson.fromJson(jsonPreferences, type);
    
            return productFromShared;
        }
    

    最后,谢谢拉维。

    【讨论】:

      猜你喜欢
      • 2018-09-29
      • 2021-01-17
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多