【问题标题】:LinkedHashSet not mainting orderLinkedHashSet 不维持秩序
【发布时间】:2018-07-09 13:20:56
【问题描述】:

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

}

【问题讨论】:

  • 您是否尝试过使用 List 而不是 Set?如果是这样,为什么不是列表?
  • 另外,您可以随时对列表进行排序
  • LinkedHashSet 未排序 LinkedHashSet 是根据插入排序的,给我们一个示例,您期望什么以及实际结果是什么
  • @BasilBattikhi.. 请参阅这篇文章了解我想要实现的目标。我已经坚持了这么久。 stackoverflow.com/questions/51046473/…
  • 我更喜欢将集合保存为共享首选项中的 json,然后您可以将对象从 sharedpreference 检索到linkedHashSet

标签: java android sharedpreferences onresume onpause


【解决方案1】:

这是SharedPreferences 为您的用例工作的方式的问题。

您正在使用putStringSet 保存LinkedHashSet,但在内部这被转换为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

【讨论】:

  • 我已尝试使用您标记的帖子中的答案,但仍然无法正常工作。我将用我尝试过的内容更新我上面的帖子
猜你喜欢
  • 2014-07-14
  • 2017-03-04
  • 2014-11-05
  • 1970-01-01
  • 2015-10-28
  • 2018-04-17
  • 2017-05-29
  • 1970-01-01
  • 2021-07-19
相关资源
最近更新 更多