2012-07-29 107 views
0

我有一些列表視圖與「場地」,在一個城市的地方。當你點擊它時,你使用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); 
      } 
+0

我很好奇你爲什麼要用SharedPreferences跳過所有這些箍環。聽起來像SQLite數據庫中的表格的工作,只是列出用戶收藏的場地的所有ID。所以當你顯示圖標時,檢查數據庫以查看它是否在那裏。或者我誤解了一些東西? – MattC 2012-07-29 21:28:30

回答

0

我不知道這件事,但你的問題可能是SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);

據我所知,你應該使用類似:SharedPreferences sharedPreferences = getPreferences("prefs_file_name", MODE_PRIVATE);,而不是你也行。

您也可以將您的首選項保存在默認的共享首選項中。使用SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

查看getDefaultSharedPreferences (Context context)方法規範。

0

你能發佈更多(即所有的活動)代碼嗎?除此之外,我還認爲你應該使用數據庫,你調用的共享首選項是可以的(你的調用只需要調用sharedPreferences(String,int)作爲字符串的活動名稱。每次打開活動時,這個文件都會一直存在,直到你實際上刪除了它。共享首選項幾乎只是存儲在設備上的平面文件。

有些事情: 1)當你做了editor.clear() - 你做了什麼,2)你做了其他更改在該編輯器(例如editor.putString()或其他)上。它不會清除文件,它會清除它,然後插入在該編輯器實例上添加的任何內容。2)對於字符串,null和「」並不是相同的東西。這就是爲什麼當你初始化你的字符串爲null時它會給你一個null。

如果你可以發佈更多的代碼,我可以嘗試和幫助更多。另外,身份證如何傳遞給您的活動?