android - Storing list of position in sharedPreferences, and retrieve in another activity -
i want similar this, have used cardview recyclerview. added favourite button cardview below can see full code. in recyclerview adapter print toast per position , working fine, need save int value of position in shared preferences in arraylist , display arraylist in next intent.
this recyclerview adapter
public void onbindviewholder(nameviewholder holder, final int position) { holder.textview.settext(names.get(position).textview); holder.favourite.setonclicklistener(new view.onclicklistener() { @override public void onclick(view view) { sharedpreferences sp = preferencemanager.getdefaultsharedpreferences(view.getcontext()); sharedpreferences.editor editor = sp.edit(); editor.putint("key", position); //may or may not be. //add code here save position in array toast.maketext(view.getcontext(),"fav "+position,toast.length_short).show(); } });
cardview.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.cardview xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/cardview" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="3dp" android:orientation="vertical" app:cardbackgroundcolor="@android:color/transparent" app:cardcornerradius="8dp" app:cardelevation="3dp" app:cardpreventcorneroverlap="false" app:cardusecompatpadding="true"> <textview android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingleft="20dp" android:paddingtop="3dp" android:textalignment="center" android:textcolor="#ff9901" android:textsize="35sp" android:textstyle="italic" /> <relativelayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <imagebutton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentright="true" android:id="@+id/favourite" android:src="@drawable/star" android:background="@android:color/transparent" /> </relativelayout> </android.support.v7.widget.cardview>
provide me getting arraylist prefrences , how use in listview too.
first of all, consider pass data in bundle through intent. if don't need store information after app closing, use way.
if want save data, through re-running app, sharedpreferences fine, here code, how can implement functionality. first let's write snippet helps restore items , update adapter them:
private static final string checked_items_ref = "checked_items"; private sharedpreferences sharedpreferences = getcontext().getsharedpreferences("mysharedprefs", mode_private); private void restoreadapterstate(recyclerview.adapter adapter) { set<string> savedcheckeditems = sharedpreferences.getstringset(checked_items_ref, new hashset<>()); list<integer> checkedpositions = converttocheckeditems(savedcheckeditems); (integer position : checkedpositions) { //update somehow info checked items, example in //adapter can store set of checked positions , in //onbindviewholder function check viewholder position //contained in set adapter.notifyitemchanged(position); } } private list<integer> converttocheckeditems(set<string> checkeditems) { list<integer> result = new arraylist<>(); for(string itempositionstr : checkeditems) { int position = integer.parseint(itempositionstr); result.add(position); } return result; }
note can follow advise in comment , restoreadapterstate
modified:
private void restoreadapterstate(multicheckedadapter adapter) { set<string> savedcheckeditems = sharedpreferences.getstringset(checked_items_ref, new hashset<>()); list<integer> checkedpositions = converttocheckeditems(savedcheckeditems); adapter.setcheckedpositions(new hashset<integer>(checkedpositions)); }
and in multycheckedadapter
have like:
private set<integer> checkedpositions = new hashset<>(); public setcheckedpositions(set<integer> checkedpositions) { this.checkedpositions = checkedpositions; (integer position : checkedpositions) { adapter.notifyitemchanged(position); } } ... @override public void onbindviewholder(myholder holder, final int position) { if (checkedpositions.contains(position)) { //use 1 binding } else { //use binding } } ...
then need change snippet:
private set<integer> checkedpositions = new hashset<>(); public void onbindviewholder(nameviewholder holder, final int position) { holder.textview.settext(names.get(position).textview); holder.favourite.setonclicklistener(new view.onclicklistener() { @override public void onclick(view view) { //check somehow current item checked or not. //for example store set of checked items in adapter //let's declaration set<integer> checkeditems; if (checkedpositions.contains(position)) { checkedpositions.remove(position); removecheckeditem(position); } else { checkedpositions.add(position); savecheckeditem(position); } } }); } private void savecheckeditem(int position) { set<string> savedcheckeditems = sharedpreferences.getstringset(checked_items_ref, new hashset<>()); string positionstr = string.valueof(position); if (!savedcheckeditems.contains(positionstr)) { savedcheckeditems.add(positionstr); sharedpreferences.edit().putstringset(checked_items_ref, savedcheckeditems).apply(); } } private void removecheckeditem(int position) { set<string> savedcheckeditems = sharedpreferences.getstringset(checked_items_ref, new hashset<>()); string positionstr = string.valueof(position); if (savedcheckeditems.contains(positionstr)) { savedcheckeditems.remove(positionstr); sharedpreferences.edit().putstringset(checked_items_ref, savedcheckeditems).apply(); } }
Comments
Post a Comment