私は Android の初心者で、自分があまり得意ではないことを知っています。これは最善の方法ではないかもしれませんが、これに多くの時間を費やしています。
Context : ActivityA には listA と listB (両方ともカスタム オブジェクトを使用) と gridview があります。ListA は JSON 要求を実行し、応答が提供するすべてのもので満たされます。ListB には listA.get(0) しかありません。gridviewA は listA を表示します。すべてのカスタム オブジェクトには、「インストールされた」ブール値があります。gridviewA のアイテムをクリックすると (つまり、listA.get(0) = listB.get(0))、listA のすべてのアイテムを別の gridviewB に表示する新しい ActivityB が開始されます。それらの項目の 1 つをクリックすると、それが listB に追加されます (installed が true に設定されます)。gridViewA の項目には、gridViewA、listB、および sharedPreferences から項目を削除するボタンがあります (installed は false に設定されています)。
私が欲しいもの: ActivityBアイテムの1つをクリックしたら、それをsharedPreferencesに追加したいのですが、各アイテムを追加した順序をアプリケーションに覚えてもらいたいです。
私がしたこと: sharedPreferences はセットなので、「sharedPrefs キーの先頭に ID を追加してみたら、gridviewA にどれを表示するかがわかります」と思いました。それはうまくいきますが、いくつかのアイテムを削除して他のアイテムを読み込もうとすると問題が発生します。アイテムは逆になります。
例 :
4 つのアイテムを「インストール」しました。gridviewA は次のようになります。
V | W
X | よ
Z
Sharedprefs は次のようになります (数字は「インストールされた」オブジェクトの量です):
0_V = V // 1_W = W // 2_X = X // 3_Y = Y // 4_Z = Z
アイテム X と Y を削除するとします。グリッドビューは次のようになります。
V | W
Z
Sharedprefs は次のようになります。
0_V = V // 1_W = W // 4_Z = Z
ここで、アイテム X を再度追加すると、グリッドビューは次のようになります。
V | 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();
}
最悪の部分は、これを行うための非常に簡単な方法があると確信していますが、それを見つけることができないようです.
フィードバックをありがとう:)