【问题标题】:save arraylist in shared preference将arraylist保存在共享首选项中
【发布时间】:2015-08-13 10:41:20
【问题描述】:

我将值存储在ArrayList 中并将其传递给使用捆绑包到下一个Fragment,然后我将值设置为我的TextView,直到这里它工作正常,现在转到另一个页面并继续应用程序再回到那个Fragment,我的所有数据都去了,所以我试图将它存储在首选项中,但首选项不允许访问ArrayList,以下是我的代码

 public class Add_to_cart extends Fragment {

    private Button continue_shopping;
    private Button checkout;
    ListView list;
    private TextView _decrease,mBTIncrement,_value;
    private CustomListAdapter adapter;
    private ArrayList<String> alst;
    private ArrayList<String> alstimg;
    private ArrayList<String> alstprc;
    private String bname;
    private ArrayList<String> alsttitle;
    private ArrayList<String> alsttype;

    public static ArrayList<String> static_Alst;
    public Add_to_cart(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

        final View rootView = inflater.inflate(R.layout.list_view_addtocart, container, false);

        alst=new ArrayList<String>();
        alstimg=new ArrayList<String>();
        Bundle bundle = this.getArguments();
        alst = bundle.getStringArrayList("prducts_id");
        alsttype = bundle.getStringArrayList("prducts_type");
        alstimg=bundle.getStringArrayList("prducts_imgs");
        alsttitle=bundle.getStringArrayList("prducts_title");

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        System.out.println("TEst--" + alst);

       // Toast.makeText(getActivity(),"Testing"+alstimg,Toast.LENGTH_LONG).show();
        list=(ListView)rootView.findViewById(R.id.list_addtocart);

        adapter = new CustomListAdapter(getActivity(),alst,alstimg,alsttitle,alsttype);

        list.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
                // TODO Auto-generated method stub
            }
        });
        return rootView;
    }

    public class CustomListAdapter extends BaseAdapter {

        private Context context;
        private ArrayList<String> listData;
        private ArrayList<String> listDataimg;
        private ArrayList<String> listDatatitle;
        private ArrayList<String> listDatatype;
        private AQuery aQuery;
        String dollars="\u0024";

        public CustomListAdapter(Context context,ArrayList<String> listData,ArrayList<String> listDataimg,ArrayList<String> listDatatitle,ArrayList<String> listDatatype) {
            this.context = context;
            this.listData=listData;
            this.listDataimg=listDataimg;
            this.listDatatitle=listDatatitle;
            this.listDatatype=listDatatype;
           aQuery = new AQuery(this.context);
        }

        public void save_User_To_Shared_Prefs(Context context) {
            SharedPreferences appSharedPrefs = PreferenceManager
                    .getDefaultSharedPreferences(context.getApplicationContext());
            SharedPreferences.Editor prefsEditor = appSharedPrefs.edit();
            Gson gson = new Gson();
            String json = gson.toJson(listData);
            Add_to_cart.static_Alst=listData;
            prefsEditor.putString("user", json);
            prefsEditor.commit();
        }

        @Override
        public int getCount() {
            return listData.size();
        }

        @Override
        public Object getItem(int position) {
            return listData.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = LayoutInflater.from(getActivity()).inflate(R.layout.list_item_addtocart, null);
                holder.propic = (ImageView) convertView.findViewById(R.id.img_addtocart);
                holder.txtproname = (TextView) convertView.findViewById(R.id.proname_addtocart);
                holder.txtprofilecast = (TextView) convertView.findViewById(R.id.proprice_addtocart);
                holder.txtsize = (TextView) convertView.findViewById(R.id.txt_size);
                _decrease = (TextView) convertView.findViewById(R.id.minuss_addtocart);
                mBTIncrement = (TextView) convertView.findViewById(R.id.plus_addtocart);
                _value = (EditText)convertView.findViewById(R.id.edt_procount_addtocart);

                convertView.setTag(holder);
            }else{
                holder = (ViewHolder) convertView.getTag();
            }

            mBTIncrement.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    increment();
                }
            });

            _decrease.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    decrement();
                }
            });

            holder.txtprofilecast.setText(dollars+listData.get(position));
            holder.txtproname.setText(listDatatitle.get(position));
            holder.txtsize.setText(listDatatype.get(position));
            System.out.println("Image ka array " + listDataimg.get(position));

            //Picasso.with(mContext).load(mThumbIds[position]).centerCrop().into(imageView);
            // Picasso.with(context).load(listDataimg.get(position)).into(holder.propic);
            aQuery.id(holder.propic).image(listDataimg.get(position), true, true, 0, R.drawable.ic_launcher);

            return convertView;
        }

        class ViewHolder{
            ImageView propic;
            TextView txtproname;
            TextView txtprofilecast;
            TextView txtsize;
        }
    }
}

【问题讨论】:

    标签: android android-fragments arraylist sharedpreferences bundle


    【解决方案1】:

    sharedpreference中存储和检索arraylist的完整示例:http://blog.nkdroidsolutions.com/arraylist-in-sharedpreferences/

      public void storeFavorites(Context context, List favorites) {
        // used for store arrayList in json format
                SharedPreferences settings;
                Editor editor;
                settings = context.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
                editor = settings.edit();
                Gson gson = new Gson();
                String jsonFavorites = gson.toJson(favorites);
                editor.putString(FAVORITES, jsonFavorites);
                editor.commit();
            }
    
    
            public ArrayList loadFavorites(Context context) {
        // used for retrieving arraylist from json formatted string
                SharedPreferences settings;
                List favorites;
                settings = context.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
                if (settings.contains(FAVORITES)) {
                    String jsonFavorites = settings.getString(FAVORITES, null);
                    Gson gson = new Gson();
                    BeanSampleList[] favoriteItems = gson.fromJson(jsonFavorites,BeanSampleList[].class);
                    favorites = Arrays.asList(favoriteItems);
                    favorites = new ArrayList(favorites);
                } else
                    return null;
                return (ArrayList) favorites;
            }
    
    
            public void addFavorite(Context context, BeanSampleList beanSampleList) {
                List favorites = loadFavorites(context);
                if (favorites == null)
                    favorites = new ArrayList();
                favorites.add(beanSampleList);
                storeFavorites(context, favorites);
            }
    
    
            public void removeFavorite(Context context, BeanSampleList beanSampleList) {
                ArrayList favorites = loadFavorites(context);
                if (favorites != null) {
                    favorites.remove(beanSampleList);
                    storeFavorites(context, favorites);
                }
            }
    

    【讨论】:

    • 能否解释一下这行代码 BeanSampleList[] favoriteItems = gson.fromJson(jsonFavorites,BeanSampleList[].class);
    【解决方案2】:

    使用 tinydb。检查以下链接,您可能会有所了解。 https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo

    使用 tinydb,您可以将数组存储在本地数据库中。

    【讨论】:

      【解决方案3】:

      你可以使用gson:

      保存首选项:

       public void save_User_To_Shared_Prefs(Context context, List<User> users) {
              SharedPreferences settings;
              Editor editor;
      
              settings = context.getSharedPreferences(PREFS_NAME,
                      Context.MODE_PRIVATE);
              editor = settings.edit();
      
              Gson gson = new Gson();
              String jsonUsers = gson.toJson(users);
      
              editor.putString(USERS, jsonUsers);
      
              editor.commit();
          }
      

      获取首选项:

      public ArrayList<User> getUsers(Context context) {
              SharedPreferences settings;
              List<User> users;
      
              settings = context.getSharedPreferences(PREFS_NAME,
                      Context.MODE_PRIVATE);
      
              if (settings.contains(USERS)) {
                  String jsonUsers = settings.getString(USERS, null);
                  Gson gson = new Gson();
                  User[] userItems = gson.fromJson(jsonUsers,
                          User[].class);
      
                  users = Arrays.asList(userItems);
                  users= new ArrayList<User>(users);
              } else
                  return null;
      
              return (ArrayList<User>) users;
          }
      

      添加用户:

      public void addUser(Context context, User user) {
              List<Product> favorites = getUsers(context);
              if (users == null)
                  users = new ArrayList<User>();
              users.add(user);
              save_User_To_Shared_Prefs(context, users);
          }
      

      【讨论】:

      • 这里是什么列表
      • @Johnson - 这是一个用户类型的列表。它包含所有用户对象。你可以在这里根据你想要的对象进行修改。
      【解决方案4】:

      首先从下面的链接下载Gson.jar,然后将其添加到您项目的libs文件夹中

      http://www.java2s.com/Code/Jar/g/Downloadgson17jar.htm

      然后将 ArrayList 放入 Class 并创建该类的对象,然后您可以将该对象保存到 SharedPreferences,如下所示

      public static void save_User_To_Shared_Prefs(Context context, User _USER) {
          SharedPreferences appSharedPrefs = PreferenceManager
                  .getDefaultSharedPreferences(context.getApplicationContext());
          SharedPreferences.Editor prefsEditor = appSharedPrefs.edit();
          Gson gson = new Gson();
          String json = gson.toJson(_USER);
          prefsEditor.putString("user", json);
          prefsEditor.commit();
      
       }
      

      以上代码是一个示例 _USER objext 包含ArrayList

      要阅读对象,请看下面的代码

       public static User get_User_From_Shared_Prefs(Context context) {
      
          SharedPreferences appSharedPrefs = PreferenceManager
                  .getDefaultSharedPreferences(context.getApplicationContext());
          Gson gson = new Gson();
          String json = appSharedPrefs.getString("user", "");
      
      
          User user = gson.fromJson(json, User.class);
          return user;
      } 
      

      现在,当您想要获取 _USER 对象时,调用上述函数,结果您将拥有该对象,并且您将拥有 ArrayList

      【讨论】:

      • 我有两个片段..从我经过的地方我提到..在下一个片段中我得到..需要在其中添加哪些代码?
      • @Johnson 使用上面的代码,您希望将数组列表存储在共享首选项中,并使用下面的代码,您的数组列表为空并且您希望从共享首选项中获取值。
      • 但我的数组列表在我的适配器内
      • @Johnson 很可能您将在适配器的构造函数中传递您的数组列表,因此您在创建该适配器调用的对象的位置可以保存该数组列表。
      • 查看我编辑的问题.. public static void save_User_To_Shared_Prefs(Context context, User _USER)..它说内部类不能有静态声明
      【解决方案5】:

      另一种解决方案(刚刚想到的):

      如果您有一个名为 addtos 的数组,并且您想将该数组添加到共享首选项中,因为该变量在字典中表示为字符串,您可以将数组索引附加到该字符串的末尾。

      例如 -

      存储

      for(int i = 0; i<addtos.size(); i++)
          prefsEditor.putString("addtos"+i, addtos.get(i));
      

      接收

      int i = 0;
      while(true){
          if(prefs.getString("addtos"+i, "")!=""){  // or whatever the default dict value is
              // do something with it
              i++;
          }else{break;}
      }
      

      我觉得没问题,如果有人发现这有问题,请告诉我。

      另外,不需要 ArrayLists

      【讨论】:

      • 它不是数组..它的数组列表
      • 我知道...上面的代码适用于 Arraylists。我只是说为数组实现这一点也很容易。
      猜你喜欢
      • 2013-07-27
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多