我有一些列表視圖與「場地」,在一個城市的地方。當你點擊它時,你使用ID進入Venue頁面。共享偏好不提交
在這個場館頁面上,有一個小小的添加按鈕,上面有一個+。當你按下這個我需要:
- 要從共享偏好得到的其他收藏夾列表,我救它作爲一個逗號分隔字符串,並將其轉換成整數列表
- 添加此項目 的ID
- 將整數列表重新轉換爲逗號分隔的字符串。
- 保存該字符串相同的項下,我用「最愛」
,並進一步改變按鈕的圖像,使+成爲 -
我想我成功地做到這一點,我代碼在我的文章的底部。
現在我是我的問題,我最喜歡的字符串並沒有真正保存。出於某種原因(不知道爲什麼),每當我打開一個場地時,我從共享首選項中檢索到的字符串中有兩個值:null和333.即使當我使用editor.clear()時,也是如此。在啓動活動中,當然使用了提交,它仍然具有相同的返回值。特別是333我猜很奇怪,但我想我排除了將null保存到字符串的可能性。
現在發生的事情是:當我點擊按鈕時,大多數時間它不會第一次反應。第二次左右,我記錄了進程,然後將ID添加到共享首選項,並且我的按鈕更改得很好。然後在另一次按下,大部分是第一次沒有反應,第二次從收藏夾和按鈕更改中刪除。
但是,當我離開我的活動並打開與另一個id相同的活動時,字符串只有null和333值。
final int favID = id;
btFavourite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isFavourite(favID)){
btFavourite.setBackgroundResource(R.drawable.btn_favourites_remove);
DeleteFavourite(favID);
}else{
btFavourite.setBackgroundResource(R.drawable.btn_favourites_add);
MakeFavourite(favID);
}
}
});
}
private void SaveFavourites(List<Integer> favs){
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
String commSepFavs = IntArrToComSepString(favs);
editor.putString("favs", commSepFavs);
editor.commit();
}
private List<Integer> LoadFavourites(){
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
String favStr = sharedPreferences.getString("favs", "");
System.out.println(favStr);
if (favStr != null){
return CommaSepStringToIntArr(favStr);
}else{
return null;
}
}
public List<Integer> CommaSepStringToIntArr(String input){
List <Integer> favs= new ArrayList<Integer>();
String[] separated = null;
separated = input.split(",");
System.out.println("separated lengte " + separated.length);
String tijdelSep;
for (int i=0;i<separated.length;i++){
tijdelSep = separated[i].replace(",","").trim();
System.out.println("tijdelSep "+i+" = " + tijdelSep);
if(tijdelSep != null && tijdelSep.equals("")==false &&tijdelSep.equals("null")==false){
favs.add(Integer.parseInt(tijdelSep));
}
}
return favs;
}
public String IntArrToComSepString(List<Integer> favs){
String comSepFavs = null;
for (int i=0;i<favs.size();i++){
comSepFavs = comSepFavs +","+String.valueOf(favs.get(i));
}
return comSepFavs;
}
public boolean isFavourite(int id){
boolean isFav = false;
List<Integer> favs = LoadFavourites();
for (int i=0;i<favs.size();i++){
if(favs.get(i)==id){
isFav=true;
}
}
return isFav;
}
public void MakeFavourite(int id){
List<Integer> favs = LoadFavourites();
List<Integer> newfavs = new ArrayList<Integer>();
for (int i=0;i<favs.size();i++){
newfavs.add(favs.get(i));
}
newfavs.add(id);
SaveFavourites(newfavs);
}
public void DeleteFavourite(int id){
List<Integer> favs = LoadFavourites();
List<Integer> newfavs = new ArrayList<Integer>();
int j=0;
for (int i=0;i<favs.size();i++){
if(favs.get(i) != id){
newfavs.add(favs.get(i));
j++;
}
}
SaveFavourites(newfavs);
}
我很好奇你爲什麼要用SharedPreferences跳過所有這些箍環。聽起來像SQLite數據庫中的表格的工作,只是列出用戶收藏的場地的所有ID。所以當你顯示圖標時,檢查數據庫以查看它是否在那裏。或者我誤解了一些東西? – MattC 2012-07-29 21:28:30