Agregar el botón favorito en la vista de lista

Tengo un listview que tiene un botón preferido para cada artículo de la lista que cuando chascado debe agregar el artículo de la lista a otra actividad llamada mis fav9rites. Estoy utilizando un Baseadapter para el listview y Sharedpreference para agregar favoritos. Cuando hago clic en el botón favorito, el elemento de vista de lista se agrega en la actividad de mis favoritos pero me enfrento a los siguientes problemas:

1) el botón favorito cuando se hace clic se oscurece, lo que indica que el elemento de la lista se agrega a los favoritos. Esto sucede pero cuando cierro la actividad y vuelvo el botón vuelve atrás en vez de ser oscuro

2) en la prensa larga en el artículo de la lista en mi actividad de los favoritos, el artículo de la lista se quitará de los favoritos pero esto no está sucediendo.

Espero que todos comprendan mi pregunta

Mi código

Mi adaptador base

 public View getView(final int position, View view, ViewGroup parent) { final ViewHolder holder; if(view == null){ holder = new ViewHolder(); view = inflater.inflate(R.layout.beg_list_item,null); holder.listHeading = (TextView) view.findViewById(R.id.beg_list_itemTextView); // holder.listHash = (TextView) view.findViewById(R.id.listview_hashtags); holder.alphabetList = (ImageView) view.findViewById(R.id.beg_list_itemImageView); holder.favoriteImg = (ImageView) view.findViewById(R.id.favbtn); view.setTag(holder); }else{ holder = (ViewHolder) view.getTag(); } CodeList code = (CodeList) getItem(position); holder.listHeading.setText(codeList.get(position).getListHeading()); imageLoader.DisplayImage(codeList.get(position).getAlphabetimg(), holder.alphabetList); // holder.listHash.setText(codeList.get(position).getListHashTags()); if (checkFavoriteItem(code)) { holder.favoriteImg.setImageResource(R.drawable.favorite); holder.favoriteImg.setTag("yes"); } else { holder.favoriteImg.setImageResource(R.drawable.unfavorite); holder.favoriteImg.setTag("no"); } view.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0){ Intent intent = new Intent(context, SingleItemView.class); //intent.putExtra("listheading", // (codeList.get(position).getListHeading())); //intent.putExtra("alphabetimg", // (codeList.get(position).getAlphabetimg())); intent.putExtra("demovideo", (codeList.get(position).getDailogdemovideo())); intent.putExtra("download", (codeList.get(position).getDownloadCode())); // Start SingleItemView Class context.startActivity(intent); } }); final ImageView favoritesbutton = (ImageView) view.findViewById(R.id.favbtn); favoritesbutton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ String tag = favoritesbutton.getTag().toString(); if(tag.equalsIgnoreCase("no")){ shrdPrefence.addFavorite(context, codeList.get(position)); Toast.makeText(context, R.string.fav_added, Toast.LENGTH_SHORT).show(); favoritesbutton.setTag("yes"); favoritesbutton.setImageResource(R.drawable.favorite); }else{ shrdPrefence.removeFavorite(context, codeList.get(position)); favoritesbutton.setTag("no"); favoritesbutton.setImageResource(R.drawable.unfavorite); Toast.makeText(context, R.string.fav_removed, Toast.LENGTH_SHORT).show(); } } }); return view; } //Checks whether a particular product exists in SharedPreferences*/ public boolean checkFavoriteItem(CodeList checkCode) { boolean check = false; List<CodeList> favorites = shrdPrefence.getFavorites(context); if (favorites != null) { for (CodeList code : favorites) { if (code.equals(checkCode)) { check = true; break; } } } return check; } public void add(CodeList code) { codeList.add(code); notifyDataSetChanged(); } public void remove(CodeList code) { codeList.remove(code); notifyDataSetChanged(); } 

Sharedpreference.java

 public class SharedPreference { public static final String PREFS_NAME = "MY_APP"; public static final String FAVORITES = "code_Favorite"; public SharedPreference(){ super(); } public void saveFavorites(Context context, List<CodeList> favorites){ 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 void addFavorite(Context context, CodeList code){ List<CodeList> favorites = getFavorites(context); if(favorites == null) favorites = new ArrayList<CodeList>(); favorites.add(code); saveFavorites(context,favorites); } public void removeFavorite(Context context, CodeList code) { ArrayList<CodeList> favorites = getFavorites(context); if (favorites != null) { favorites.remove(code); saveFavorites(context, favorites); } } public ArrayList<CodeList> getFavorites(Context context) { SharedPreferences settings; List<CodeList> favorites; settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); if (settings.contains(FAVORITES)) { String jsonFavorites = settings.getString(FAVORITES, null); Gson gson = new Gson(); CodeList[] favoriteItems = gson.fromJson(jsonFavorites, CodeList[].class); favorites = Arrays.asList(favoriteItems); favorites = new ArrayList<CodeList>(favorites); } else return null; return (ArrayList<CodeList>) favorites; } } 

Mi favorito .. java

  public class MyFavActivity extends Activity { SharedPreference shrdPrfence; List<CodeList> favorites; FinalAdapter fnlAdpter; Context context = this.context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fav_layout); shrdPrfence = new SharedPreference(); favorites = shrdPrfence.getFavorites(MyFavActivity.this); if(favorites == null){ Dialog dialog = new Dialog(MyFavActivity.this); dialog.setTitle(R.string.nofav_title); dialog.show(); }else{ if(favorites.size() == 0){ Dialog dialog = new Dialog(MyFavActivity.this); dialog.setTitle(R.string.nofav_title); dialog.show(); } ListView favList = (ListView) findViewById(R.id.fav_layoutListView); if(favorites != null){ fnlAdpter = new FinalAdapter(MyFavActivity.this, favorites); favList.setAdapter(fnlAdpter); favList.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View arg1, int position, long arg3) { } }); favList.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { ImageView button = (ImageView) view .findViewById(R.id.favbtn); String tag = button.getTag().toString(); if (tag.equalsIgnoreCase("no")) { shrdPrfence.addFavorite(MyFavActivity.this, favorites.get(position)); Toast.makeText( MyFavActivity.this, R.string.fav_added, Toast.LENGTH_SHORT).show(); button.setTag("yes"); button.setImageResource(R.drawable.favorite); } else { shrdPrfence.removeFavorite(MyFavActivity.this, favorites.get(position)); button.setTag("no"); button.setImageResource(R.drawable.unfavorite); fnlAdpter.remove(favorites.get(position)); Toast.makeText( MyFavActivity.this, R.string.fav_removed, Toast.LENGTH_SHORT).show(); } return true; } }); } } } } 

En realidad, su método saveFavorites () funciona bien, porque sólo tiene que llamar a gson.toJson () (convertir todo en formato json)

Desea obtener datos guardados con SharedPreferences y ha utilizado esta línea para recuperar sus datos

  gson.fromJson(jsonFavorites, CodeList[].class); 

Nunca obtienes los datos guardados con esta línea, porque guardas una lista y quieres recuperar una matriz (!)

Si ha guardado una lista, debe recuperar sus datos con un token de lista. Y necesitas esta línea

  gson.fromJson(jsonFavorites,new TypeToken<ArrayList<CodeList>>() {}.getType()); 

Creo que esto resolverá su pregunta. Buena suerte.

  • El valor SharedPreferences no se actualiza
  • Cómo guardar los datos de arrayList en SharedPreferences?
  • Android Almacenamiento interno VS Preferencias compartidas
  • Preferencias compartidas entre dos procesos de la misma aplicación
  • Guardar ArrayList en SharedPreferences
  • Comportamiento SharedPreferences en Actualizar / Desinstalar
  • Cómo analizar JSON analizado para uso sin conexión
  • Android SharedPreferences Conjunto de cadenas: algunos elementos se quitan después de reiniciar la aplicación
  • Eliminación de preferencias compartidas
  • La mejor opción para almacenar nombre de usuario y contraseña en la aplicación Android
  • ¿Cómo garantizar que la imagen seleccionada por el usuario no cambia después de reiniciar Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.