0

我是 Android 新手,我知道我不是很好,这可能不是最好的方法,但我在这方面花费了太多时间。

上下文: ActivityA 有一个 listA 和一个 listB(都带有自定义对象)和一个 gridview。ListA 执行 JSON 请求,并填充响应提供的所有内容。ListB 只有 listA.get(0)。gridviewA 显示 listA。每个自定义对象都有一个“已安装”的布尔值。当我单击 gridviewA 中的项目时(因此,listA.get(0) = listB.get(0)),它会启动一个新的 ActivityB,该 ActivityB 会在另一个 gridviewB 中显示 listA 的所有项目。当我单击其中一项时,它被添加到 listB 中(已安装设置为 true)。gridViewA 中的项目有一个按钮,用于从 gridViewA、listB 和 sharedPreferences(已安装设置为 false)中删除项目。

我想要什么: 单击 ActivityB 项目之一后,我希望将其添加到我的 sharedPreferences 但我希望我的应用程序记住我添加每个项目的顺序。

我做了什么: 由于 sharedPreferences 是集合,我想“为什么不在 sharedPrefs 键的开头添加一个 ID,然后我就会知道在 gridviewA 中显示哪个”。这很好用,但是当我删除一些项目并尝试读取其他项目时出现问题,该项目将以相反的方式出现。

例子 :

我“安装”了 4 个项目,gridviewA 看起来像这样:

五 | W

X | 是

Z

Sharedprefs 看起来像这样(数字是“已安装”对象的数量):

0_V = V // 1_W = W // 2_X = X // 3_Y = Y // 4_Z = Z

假设我删除项目 X 和 Y,gridview 将是这样的:

五 | W

Z

Sharedprefs 看起来像这样:

0_V = V // 1_W = W // 4_Z = Z

现在假设我再次添加项目 X,gridview 将如下所示:

五 | W

X | Z

和 sharedPref 像这样:

0_V = V // 1_W = W // 4_Z = Z // 3_X = X

问题是:

如何保存将内容添加到共享首选项中的顺序,以便以正确的顺序显示内容?

代码 :

in ActivityA
//reads the sharedpreferences to know which widget has been installed
for (int i = 0; i < listA.size(); i++)
{
    for (Map.Entry<String, ?> entry : keys.entrySet())
    {
        if (entry.getKey().startsWith(String.valueOf(i)))
        {
            for (int j = 0; j < listA.size(); j++)
            {
                if (listA.get(j).getName().equals(entry.getValue()) && !listA.get(j).isInstalled())
                    {
                            listA.get(j).setInstalled(true);
                            if (listA.get(j).isInstalled())
                            {
                                listB.add(listWidget.get(j));

                            }
                        }
                    }
                }
            }
        }

gridviewA 的适配器:

holder.delete.setOnClickListener(new View.OnClickListener()
{
    public void onClick(View v)
    {
        Map<String, ?> keys = ActivityA.sharedPrefService.getAll();
        for (int i = 0; i < ActivityA.listA.size(); i++)
        {
                if (ActivityA.listA.get(i).getName().equals(listB.get(position).getName()))
                {
                ActivityA.listA.get(i).setInstalled(false);

                for (int j = 0; j <= listA.size(); j++)
                {

                    keys = ActivityA.sharedPrefService.getAll();
                    for (Map.Entry<String, ?> entry : keys.entrySet())
                        {
                            if (entry.getKey().equals(j + "_" + listA.get(i).getName()))
                            {
                                ActivityA.editorService.remove(j + "_" + listA.get(i).getName());
                                ActivityA.editorService.commit();                           
                            }
                    }
                }

                listB.remove(position);
                notifyDataSetChanged();
                break;
            }
        }
    }
});

和 ActivityB 当点击一个项目来安装它

    if (!ActivityA.listA.get(position).isInstalled())
    {
        // As we allow the user to install several widget before going back to ActivityMain
        // we have to directly modify ActivityA.listA and ActivityA.listB
        ActivityA.listA.get(position).setInstalled(true);
        ActivityA.listB.add(ActivityA.listA.get(position));


        String temp = listA.get(position).getName();

        int order = -1;
        for(int i=0; i<ActivityA.listA.size(); i++)
        {
            if(ActivityA.listA.get(i).isInstalled())
            {
                order++;
            }
        }

        ActivityA.editorService.putString(order + "_" +temp, temp);
        ActivityA.editorService.commit();

        keys = ActivityA.sharedPrefService.getAll();
        }

最糟糕的是,我很确定有一种非常简单的方法可以做到这一点,但我似乎找不到它。

感谢您的任何反馈:)

4

0 回答 0