我正在调用Firebase firestore中的项目列表。并将其设置为循环视图。并且我已经通过将项目的位置存储到共享偏好的数组列表中来实现将项目保存为收藏夹的功能。但我面临的问题是:假设recyclerview中有5个项目。我喜欢其中的3个项目。我毁了我的应用程序。当我再次打开我的应用程序时,我又喜欢了一个项目,然后又销毁了我的应用。在那之后,当我再次打开我的应用程序时,我喜欢的只有上次。之前的3个项目喜欢走了。我不明白为什么会发生这种事。*注意:到目前为止,我还没有添加从我的物品列表中删除点赞的功能。
下面是我的逻辑代码:
共享偏好模型
public class SharedPref {
SharedPreferences preferences;
SharedPreferences.Editor editor ;
public SharedPref(Context context) {
// TODO Auto-generated constructor stub
preferences =context.getSharedPreferences("Stackoverflow", Context.MODE_PRIVATE);
editor =preferences.edit();
}
public boolean putBoolean(String key, boolean value) {
editor.putBoolean(key, value);
return editor.commit();
}
public boolean getBoolean(String key) {
return preferences.getBoolean(key, false);
}
public boolean putString(String key, String value) {
editor.putString(key, value);
return editor.commit();
}
public String getString(String key) {
return preferences.getString(key, null);
}
public boolean putLong(String key, long value) {
editor.putLong(key, value);
return editor.commit();
}
public long getLong(String key) {
return preferences.getLong(key, 0);
}
public boolean putInt(String key, int value) {
editor.putInt(key, value);
return editor.commit();
}
public int getInt(String key) {
return preferences.getInt(key, 0);
}
public boolean putFloat(String key, float value) {
editor.putFloat(key, value);
return editor.commit();
}
public float getFloat(String key) {
return preferences.getFloat(key, 0);
}
public boolean remove(String key){
return editor.remove(key).commit();
}
public boolean clear() {
// TODO Auto-generated method stub
return editor.clear().commit();
}
public void putListString(String key, ArrayList<String> stringList) {
checkForNullKey(key);
String[] myStringList = stringList.toArray(new String[stringList.size()]);
preferences.edit().putString(key, TextUtils.join("‚‗‚", myStringList)).apply();
}
public void checkForNullKey(String key){
if (key == null){
throw new NullPointerException();
}
}
public ArrayList<String> getListString(String key) {
return new ArrayList<String>(Arrays.asList(TextUtils.split(preferences.getString(key, ""), "‚‗‚")));
}
}
适配器类别:
Boolean favimageclick=true;
SharedPref sharedPref;
ArrayList<String> favlist=new ArrayList<>();
if (sharedPref.getListString("fav")!=null)
{
Log.e("StoredData","______"+sharedPref.getListString("fav"));
for(String data:sharedPref.getListString("fav"))
{
if (data.equalsIgnoreCase(String.valueOf(position))) {
holder.imageViewFav.setBackgroundResource(R.drawable.ic_favorite);
}
}
}
holder.imageViewFav.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (favimageclick) {
holder.imageViewFav.setBackgroundResource(R.drawable.ic_favorite);
favlist.add(String.valueOf(position));
sharedPref.putListString("fav",favlist);
}
}
});
加载收藏夹后,只对视图进行更改,而不将其放入favlist
。下次当你把另一个项目添加到收藏夹时,你会把它放在favlist
中,但它只包含这一件事。之后,您将这个一项列表保存到共享的prefs中,覆盖之前的内容。
当您从共享prefs加载数据时,将其放入favlist
。
顺便说一下。,除非您的列表总是以相同的顺序使用相同的数据构建,否则将位置存储在收藏夹中会导致问题。