嗨,我正在尝试允许用户输入将存储在列表中的值。当用户退出该活动时,我希望将该列表存储(以相同的顺序)到SharedPreferences中,然后一旦用户返回,我希望它以正确的顺序再次显示。
已建议我使用LinkedHashSet,但仍不能保持顺序。
我看不到我要去哪里。
这是我的代码尝试:
public class Processing extends AppCompatActivity {
TextView textView ;
Button btnShippersCompleted, clear;
Handler handler;
ListView listView ;
String[] ListElements = new String[] {};
List<String> ListElementsArrayList ;
ArrayAdapter<String> adapter ;
String shippersCompleted;
int Hour;
SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;
LinkedHashSet hs = new LinkedHashSet();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.processing);
sharedPreferences = getSharedPreferences("MYPREFS", MODE_PRIVATE );
editor = sharedPreferences.edit();
textView = (TextView)findViewById(R.id.textView);
btnShippersCompleted = (Button)findViewById(R.id.button4) ;
listView = (ListView)findViewById(R.id.listview1);
clear = (Button) findViewById(R.id.buttonClear);
clear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editor.clear();
editor.apply();
listView.setAdapter(null);
}
});
handler = new Handler() ;
ListElementsArrayList = new ArrayList<String>(Arrays.asList(ListElements));
adapter = new ArrayAdapter<String>(Processing.this,
android.R.layout.simple_list_item_1,
ListElementsArrayList
);
listView.setAdapter(adapter);
btnShippersCompleted.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
shippersCompleted = textView.getText().toString();
Hour = sharedPreferences.getInt("Hour", 1);
ListElementsArrayList.add(shippersCompleted + " - Hour " + Hour++);
hs.addAll(ListElementsArrayList);
adapter.notifyDataSetChanged();
listView.setAdapter(adapter);
Intent intent = new Intent(getApplicationContext(), DataEntry_Primary.class);
startActivity(intent);
Toast.makeText(Processing.this, hs.toString(), Toast.LENGTH_LONG).show();
}
});
}
@Override
protected void onPause() {
super.onPause();
Set<String> set = new LinkedHashSet<>();
set.addAll(ListElementsArrayList);
editor.putStringSet("list", set);
editor.putInt("Hour", Hour);
editor.apply();
}
@Override
public void onResume() {
super.onResume();
Set<String> set = sharedPreferences.getStringSet("list", null);
if(set != null) {
ListElementsArrayList.addAll(set);
listView.setAdapter(adapter);
} else {
Toast.makeText(Processing.this, "No records have been saved!",
Toast.LENGTH_LONG).show();
}
}
当我再次参加活动时,我会得到随机的订单,如小时1、3、2、5、4。
有人可以帮忙吗?
编辑尝试失败:
public void saveOrderedCollection(Collection collection, String key){
JSONArray jsonArray = new JSONArray(collection);
editor.putString(key, jsonArray.toString());
editor.apply();
}
public Collection loadOrderedCollection(String key) throws JSONException {
ArrayList arrayList = new ArrayList();
JSONArray jsonArray = new JSONArray(sharedPreferences.getString(key, "[]"));
for (int i = 0; i < jsonArray.length(); i++) {
arrayList.add(jsonArray.get(i));
}
return arrayList;
}
@Override
protected void onPause() {
super.onPause();
saveOrderedCollection(ListElementsArrayList, String.valueOf(key));
}
@Override
public void onResume() {
super.onResume();
try {
loadOrderedCollection(String.valueOf(key));
listView.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
这是SharedPreferences
用于您的用例的方式的问题。
您要用LinkedHashSet
保存一个putStringSet
,但在内部将其转换为HashSet
:
@Override
public Editor putStringSet(String key, @Nullable Set<String> values) {
synchronized (mEditorLock) {
mModified.put(key,
(values == null) ? null : new HashSet<String>(values));
return this;
}
}
此答案涵盖了类似问题的问题,并提供了一些可能的解决方案:https://stackoverflow.com/a/35567829/9995226