Storing data in SharedPreferences - Android
In previous post Store Data – SharedPreferences – Android we discussed about cases, when we should save data in SharedPreferences....
This post is outdated and no longer maintained. The content may not reflect current best practices or tools.
In previous post Store Data – SharedPreferences – Android we discussed about cases, when we should save data in SharedPreferences. Here is a demo Android App for the same.
Create a new Android project using following information.
Project Name
SharedPreference Demo
Package Name
com.pcsalt.example.sharedpreferencedemo
Minimum SDK Version
16
Activity Type
Empty Activity
Activity Name
MainActivity
Layout Name
activity_name
Adding dependencies in build.gradle
In this tutorial we are going to display all saved keys and values in RecyclerView. So, following dependency needs to be added into SharedPreferenceDemo/app/build.gradle.
dependencies { compile ‘com.android.support:appcompat-v7:23.0.1’ compile ‘com.android.support:recyclerview-v7:23.0.1’ }
Update layout of activity_main.xml
By default, activity_main.xml comes with RelativeLayout as parent Layout and a TextView with Hello world text. Update this layout to have:
– two EditText for Key and Value,
– one Button to save Key and Value pair in SharedPreferences, and
– a RecyclerView to display all saved values in SharedPreferences.
Create list item for RecyclerView
The RecyclerView would display the saved key, value pair in a list. So, create a resource file list_item_pref.xml
Create Utility classes
It is a good idea to keep things separate, if it does not do the similar thing. For this purpose, we have two utility classes.
– Utility.java : for getting text from EditText.
– PrefUtil.java : for performing basic operations on SharedPreferences.
Create Utility.java
package com.pcsalt.example.sharedpreferencedemo; import android.widget.TextView; /** * Created by krrishnaaaa on Oct 02, 2015 */ public final class Utility { public static String getText(TextView textView) { String text = ""; if (textView != null) { text = textView.getText().toString(); } return text; } }
Create PrefUtil.java
package com.pcsalt.example.sharedpreferencedemo; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Created by krrishnaaaa on Oct 02, 2015 */ public final class PrefUtil { private static SharedPreferences getPref(Context context) { return PreferenceManager.getDefaultSharedPreferences(context); } public static void saveString(Context context, String key, String value) { getPref(context).edit().putString(key, value).apply(); } public static String getString(Context context, String key, String defValue) { return getPref(context).getString(key, defValue); } public static void removeString(Context context, String key) { getPref(context).edit().remove(key).apply(); } public static List getAllValues(Context context) { Map values = getPref(context).getAll(); List prefDataList = new ArrayList(); for (Map.Entry entry : values.entrySet()) { PrefData prefData = new PrefData(); prefData.key = entry.getKey(); prefData.value = entry.getValue().toString(); prefDataList.add(prefData); } return prefDataList; } }
Create model class PrefData.java
This model class would hold the key and value stored in SharedPreferences and list of this model would be displayed in RecyclerView.
package com.pcsalt.example.sharedpreferencedemo; /** * Created by krrishnaaaa on Oct 02, 2015 */ public final class PrefData { public String key; public String value; public PrefData() { } public PrefData(String key, String value) { this.key = key; this.value = value; } @Override public boolean equals(Object object) { return object instanceof PrefData && key.equals(((PrefData) object).key); } @Override public int hashCode() { return super.hashCode(); } }
Create Adapter for RecyclerView
This adapter will hold and display the key value stored in SharedPreferences.
package com.pcsalt.example.sharedpreferencedemo; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.List; /** * Created by krrishnaaaa on Oct 02, 2015 */ public class PrefAdapter extends RecyclerView.Adapter { private LayoutInflater mLayoutInflater; private List mPrefDataList; public PrefAdapter(Context context, List prefDataList) { this.mLayoutInflater = LayoutInflater.from(context); this.mPrefDataList = prefDataList; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mLayoutInflater.inflate(R.layout.list_item_pref, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof ViewHolder) { ViewHolder viewHolder = (ViewHolder) holder; PrefData current = mPrefDataList.get(position); viewHolder.textViewKey.setText(current.key); viewHolder.textViewValue.setText(current.value); } } @Override public int getItemCount() { if (mPrefDataList != null) { return mPrefDataList.size(); } else { return 0; } } static class ViewHolder extends RecyclerView.ViewHolder { TextView textViewKey, textViewValue; public ViewHolder(View itemView) { super(itemView); textViewKey = (TextView) itemView.findViewById(R.id.text_view_key); textViewValue = (TextView) itemView.findViewById(R.id.text_view_value); } } }
Update MainActivity.java to store and display contents to/from SharedPreferences
MainActivity will be performing following tasks:
– Link all views from its layout
– Save key and value from EditText in SharedPreferences
– Update RecyclerView with the values stored in SharedPreferences
package com.pcsalt.example.sharedpreferencedemo; import android.content.Context; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.pcsalt.example.sharedpreferencedemo.listener.RecyclerClickListener; import com.pcsalt.example.sharedpreferencedemo.listener.RecyclerTouchListener; import java.util.List; public class MainActivity extends AppCompatActivity { private Context mContext = MainActivity.this; private EditText mEditTextKey; private EditText mEditTextValue; private List mPrefDataList; private PrefAdapter mPrefAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); } private void initViews() { mEditTextKey = (EditText) findViewById(R.id.edit_text_key); mEditTextValue = (EditText) findViewById(R.id.edit_text_value); Button buttonSave = (Button) findViewById(R.id.button_save); buttonSave.setOnClickListener(mOnClickListener); RecyclerView recyclerViewPrefValues = (RecyclerView) findViewById(R.id.recycler_view_pref_values); recyclerViewPrefValues.setLayoutManager(new LinearLayoutManager(mContext)); mPrefDataList = PrefUtil.getAllValues(mContext); mPrefAdapter = new PrefAdapter(mContext, mPrefDataList); recyclerViewPrefValues.setAdapter(mPrefAdapter); RecyclerTouchListener recyclerTouchListener = new RecyclerTouchListener(mContext, recyclerViewPrefValues, new RecyclerClickListener() { @Override public void onClick(View view, int position) { PrefData prefData = mPrefDataList.get(position); PrefUtil.removeString(mContext, prefData.key); mPrefDataList.remove(position); mPrefAdapter.notifyItemRemoved(position); } }); recyclerViewPrefValues.addOnItemTouchListener(recyclerTouchListener); } private void saveValueInPref() { String key = Utility.getText(mEditTextKey); String value = Utility.getText(mEditTextValue); if (key.isEmpty()) { mEditTextKey.setError(“Enter key”); } else if (value.isEmpty()) { mEditTextValue.setError(“Enter value”); } else { PrefUtil.saveString(mContext, key, value); mEditTextKey.setText(""); mEditTextValue.setText(""); PrefData newPrefData = new PrefData(key, value); if (mPrefDataList.contains(newPrefData)) { int index = mPrefDataList.indexOf(newPrefData); mPrefDataList.remove(index); mPrefAdapter.notifyItemRemoved(index); } mPrefDataList.add(newPrefData); int position = mPrefAdapter.getItemCount() - 1; mPrefAdapter.notifyItemInserted(position); } } private View.OnClickListener mOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_save: saveValueInPref(); break; } } }; }
Download source code
Working source code is shared on GitHub – SharedPreference-Demo