Android在SharedPreferences中保存多个值

时间:2018-06-15 16:23:44

标签: android sharedpreferences

我有一个非常简单的切换按钮"喜欢"系统。用户ID和照片ID被发送到数据库并存储...然后,在应用程序中,我使用共享首选项来记住用户是否喜欢照片。

imageToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    addLike();
                    SharedPreferences preferences = getPreferences(MODE_PRIVATE);
                    SharedPreferences.Editor editor = preferences.edit();
                    editor.putBoolean("liked", imageToggle.isChecked()); // value to store
                    editor.putString("pic_id", foto_id);
                    editor.commit();
                } else {
                    unLike();
                    SharedPreferences preferences = getPreferences(MODE_PRIVATE);
                    SharedPreferences.Editor editor = preferences.edit();
                    editor.putBoolean("liked", false); // value to store
                    editor.commit();

                }
            }
        });

然后......每当创建视图时......都会检查首选项以查看照片是否被喜欢。

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
        boolean liked = preferences.getBoolean("liked", false);
        String pic = preferences.getString("pic_id", "0");
        final ToggleButton imageToggle = (ToggleButton) findViewById(R.id.like);
        if (pic.equals(foto_id)) {
            imageToggle.setChecked(liked);
        }

问题......你可能已经猜到了...这只适用于一次一张照片。如果我点击另一张照片并喜欢它,则该照片的ID将成为pic_id,并且原始照片将被取消选中。

我甚至不确定SharedPreferences是实现我想要做的事情的正确方法。 (存储和检索喜欢的照片的多个值)。我已经查看了从保存套件到将所有内容转换为JSON的所有内容......我已经考虑过每次查询数据库以确定用户是否喜欢特定的照片...

......但是我接近我想要实现的目标,我只知道必须有一些非常简单的方法来做到这一点,我并没有意识到这一点。我想让SharedPreferences做的就是记住我是否喜欢每张单独的照片。每张照片可能只是一个新的SharedPreference?

对于我到目前为止所做的事情,最简单的解决方案是什么?

3 个答案:

答案 0 :(得分:0)

因为您不知道将选择多少张照片并且它可以非常动态地更改,您可能希望将类似照片ID的列表保存到共享首选项中。通常,共享首选项只允许您保存数据集而不是列表,因此这个问题显示了如何执行此操作。

Save ArrayList to SharedPreferences

答案 1 :(得分:0)

是的,sharedPreferences应该有效。您可以使用fotoID作为键,如果您有fotoID,则可以在共享首选项中设置和查找fotoID以管理布尔值" likes"。

imageToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                addLike();
                SharedPreferences preferences = getPreferences(MODE_PRIVATE);
                SharedPreferences.Editor editor = preferences.edit();
                editor.putBoolean(foto_id, imageToggle.isChecked()); // changed from "liked". Changed "foto_id" to foto_id -mysticola
                // remove this line editor.putString("pic_id", foto_id);
                editor.commit();
            } else {
                unLike();
                SharedPreferences preferences = getPreferences(MODE_PRIVATE);
                SharedPreferences.Editor editor = preferences.edit();
                editor.putBoolean(foto_id, false); // changed from liked
                editor.commit();

            }
        }
    });

   SharedPreferences preferences = getPreferences(MODE_PRIVATE);
        boolean liked = preferences.getBoolean(foto_id, false); // change from "liked"
        // remove String pic = preferences.getString("pic_id", "0");
        final ToggleButton imageToggle = (ToggleButton) findViewById(R.id.like);
        if (liked) { // changed this part
            imageToggle.setChecked(liked);
        } 

答案 2 :(得分:0)

试试这个:

 var buttonLocalState: SharedPreferences =
    context.getSharedPreferences(SPP_NAME, MODE_PRIVATE)

 fun savebuttonstate(mExampleList: ArrayList<commentItemModel>) {
    val userLocalDatabaseEditor: SharedPreferences.Editor = buttonLocalState.edit()
    val gson = Gson()
    val json = gson.toJson(mExampleList)
    userLocalDatabaseEditor.putString("yesbtn list", json)
    userLocalDatabaseEditor.apply()
}


fun getyesBtn(): ArrayList<commentItemModel> {
    val gson = Gson()
    var mExampleList: ArrayList<commentItemModel> = ArrayList<commentItemModel>()
    val json: String = buttonLocalState.getString("yesbtn list", null).toString()
    val type: Type = object : TypeToken<ArrayList<commentItemModel?>?>() {}.getType()

    if (!mExampleList.isEmpty()) {
        mExampleList = gson.fromJson<Any>(json, type) as ArrayList<commentItemModel>
    }
    return mExampleList
}

这是将项目添加到列表的模型类,例如:list.Add(commentItemModel(1, true))

data class commentItemModel(var id: Int, var clicked: Boolean) {

}