Android 共享首选项和顺序

Android 共享首选项和顺序,android,sharedpreferences,Android,Sharedpreferences,我是Android新手,我知道我不是很好,这可能不是最好的方法,但我在这上面花了太多时间 上下文: ActivityA有一个listA和一个listB(都带有自定义对象)以及一个gridview。ListA执行一个JSON请求,并填充响应提供的所有内容。ListB只有listA.get(0)。 gridviewA显示listA。每个自定义对象都有一个“已安装”布尔值。 当我单击gridviewA中的项目(因此,listA.get(0)=listB.get(0))时,它会启动一个新的Activit

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

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

我想要什么: 单击其中一个ActivityB项目后,我希望它被添加到我的SharedReferences中,但我希望我的应用程序记住我添加每个项目的顺序

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

例如:

我“安装”了4项,gridviewA如下所示:

V | W

X | Y

Z

SharedPref如下所示(数字是“已安装”对象的数量):

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

假设我删除项目X和Y,gridview将如下所示:

V | W

Z

SharedPref如下所示:

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

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

V | W

X | Z

SharedRef是这样的:

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));

                            }
                        }
                    }
                }
            }
        }
活动中的

//读取SharedReferences以了解已安装的小部件
对于(int i=0;i
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;
            }
        }
    }
});
holder.delete.setOnClickListener(新视图.OnClickListener()
{
公共void onClick(视图v)
{
Map keys=ActivityA.sharedPrefService.getAll();
对于(int i=0;i对于(int j=0;j选项1:使用当前时间而不是ID。选项2:在附加首选项中记住上次使用的ID,并在添加新项时始终使用该ID并递增。选项3:如果可能添加的项数较少,请将其保存为单个首选项中的列表entry@MichaelButscher选项1:我必须迭代日期然后呢?我想我真的不明白你的意思。选项2:我会先试试。选项3:我看了一下,发现我必须创建一个映射列表,将每个项添加到列表中的新映射中,然后保存列表,对吗?好的,它工作得很好,但是如果我做了很多循环,最多100个,如果只有3个,对性能不是很坏吗已安装的对象?由于每次安装某个对象时索引都会不断增加,因此可能会非常高。可能需要更彻底的代码更改。一种方法是只处理一次每个首选项键,将其拆分为ID和名称部分,然后在删除条目时仅比较名称部分。对于安装按照正确的顺序,收集列表中的所有键,并使用
比较器对它们进行排序,比较器再次拆分为多个部分,并使用ID部分进行比较
    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();
        }