LinkedHashSet不维护顺序

时间:2018-07-09 13:20:57

标签: java android sharedpreferences onresume onpause

嗨,我正在尝试允许用户输入将存储在列表中的值。当用户退出该活动时,我希望将该列表存储(以相同的顺序)到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();
    }

}

1 个答案:

答案 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://github.com/aosp-mirror/platform_frameworks_base/blob/5edae415b08bd62eb50c7857a897173c4050983d/core/java/android/app/SharedPreferencesImpl.java#L400

此答案涵盖了类似问题的问题,并提供了一些可能的解决方案:https://stackoverflow.com/a/35567829/9995226