我是Android新手,我知道我不是很好,这可能不是最好的方式,但我花了太多时间在这上面。
上下文: ActivityA有一个listA和一个listB(都带有自定义对象)和gridview。 ListA执行JSON请求并填充响应提供的所有内容。 ListB只有listA.get(0)。 gridviewA显示listA。每个自定义对象都有一个“已安装”的布尔值。 当我点击gridviewA中的项目(所以,listA.get(0)= listB.get(0))时,它会启动一个新的ActivityB,它在另一个gridviewB中显示所有listA的项目。当我点击其中一个项目时,它会被添加到listB中(安装设置为true)。 gridViewA中的项目有一个按钮,用于从gridViewA,listB和sharedPreferences中删除项目(安装设置为false)。
我想要的是什么: 一旦我点击其中一个ActivityB项目,我希望它被添加到我的sharedPreferences但我希望我的应用程序记住我添加每个项目的顺序。
我做了什么: 由于sharedPreferences是Sets,我想“为什么不在sharedPrefs键的开头添加ID,然后我就知道在gridviewA中显示哪一个”。 这工作正常,但当我删除一些项目并尝试读取其他项目时会出现问题,该项目将以相反的方式进行。
示例:
我“安装”了4个项目,gridviewA看起来像这样:
V | w ^
X | ÿ
ž
Sharedprefs看起来像这样(数字是“已安装”对象的数量):
0_V = V // 1_W = W // 2_X = X // 3_Y = Y // 4_Z = Z
假设我删除项目X和Y,gridview将是这样的:
V | w ^
ž
Sharedprefs看起来像这样:
0_V = V // 1_W = W // 4_Z = Z
现在假设我再次添加项目X,gridview将如下所示:
V | w ^
X | ž
和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();
}
最糟糕的是,我很确定有一种非常简单的方法可以做到这一点,但我似乎无法找到它。
感谢您的任何反馈:)