我有一些带有“场地”的列表视图,位于城市中。当您单击它时,您将使用ID转到Venue页面。
在这个场地页面上,有一个小的添加按钮,上面有一个+。当你按下我需要:
并进一步更改按钮的图像,因此+变为 -
我以为我设法做到了这一点,我的代码位于我的帖子底部。
现在我的问题是,我最喜欢的字符串并没有真正保存。出于某种原因(不明白为什么)每次我打开一个场地时,我从共享首选项中检索的字符串中有两个值:null和333.即使我使用了editor.clear();在启动活动中,当然使用了提交,它仍然具有相同的返回值。特别是333我觉得非常奇怪,但我认为我也排除了将字符串保存为字符串的可能性。
现在发生的事情是:当我点击按钮时,大多数时候第一次没有反应。第二次左右,我记录了这个过程,然后将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 :(得分:0)
我不确定,但您的问题可能在SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
AFAIK,您应该使用类似:SharedPreferences sharedPreferences = getPreferences("prefs_file_name", MODE_PRIVATE);
而不是您拥有的行。
您也可以将首选项保存在默认的共享首选项中。使用SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
答案 1 :(得分:0)
您可以发布更多(即所有活动)代码吗?除此之外,我还认为你应该使用一个数据库,你的被调用共享首选项是可以的(你的调用只是调用sharedPreferences(String,int),活动名称为字符串。每次打开活动时该文件都会保留,直到实际上你删除了它。共享首选项几乎只是存储在设备上的平面文件。
有些事情: 1)当你做了editor.clear() - 你提交了吗?2)你是否对该编辑器进行了其他更改(例如editor.putString()或其他)。它实际上不会清除文件,它会清除它然后插入在该编辑器实例上添加的任何内容
2)null和“”对于字符串不一样。这就是为什么当你将String初始化为null时它会给你一个null。
如果您可以发布更多代码,我可以尝试提供更多帮助。另外,ID如何传递给您的活动?