2012-07-29 120 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。

如果你可以发布更多的代码,我可以尝试和帮助更多。另外,身份证如何传递给您的活动?