java - 始终添加到最后一个 Listitem 位置并保持它
问题描述
在我的应用程序上,用户可以输入每小时更新的金额。例如,在第一个小时,他们会输入 100 并将其添加到最后一个。他们将导航到不同的活动,然后在下一小时到来时返回该活动并输入 200。
这似乎工作正常,尽管在可能一两个条目之后,列表似乎有了自己的想法并开始随机排序列表。
我想要实现的截图:
正如你所看到的,第三个已经占据了第二个的位置,这是随机发生的,他们去了不同的位置。
这是我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.processing);
sharedPreferences = getSharedPreferences("MYPREFS", MODE_PRIVATE );
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) {
listView.setAdapter(null);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear();
editor.apply();
}
});
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) {
listView.setAdapter(adapter);
shippersCompleted = textView.getText().toString();
Hour = sharedPreferences.getInt("Hour", 1);
ListElementsArrayList.add(shippersCompleted + "- Hour " + Hour++);
adapter.notifyDataSetChanged();
}
});
}
@Override
protected void onPause() {
super.onPause();
//Set the values
SharedPreferences.Editor editor = sharedPreferences.edit();
Set<String> set = new HashSet<String>();
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();
}
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
任何人都可以帮助我,以便每次它添加到最后一个位置并且当我再次返回该活动时,它会保持该位置。
谢谢
解决方案
如果您想保留插入顺序(可以有重复的元素),请始终使用 List,当顺序无关紧要并且您不想要重复数据时使用 HashSet。
用 List 而不是 HashSet 改变你的 onPause() 和 onResume()
@Override
protected void onPause() {
super.onPause();
//Set the values
SharedPreferences.Editor editor = sharedPreferences.edit();
//save in LinkedHashSet instead of HashSet
Set<String> set = new LinkedHashSet<String>();
set.addAll(ListElementsArrayList);
editor.putStringSet("list", set);
editor.putInt("Hour", Hour);
editor.apply();
}
@Override
public void onResume() {
super.onResume();
//get saved list and set if for display
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();
}
}
推荐阅读
- vb.net - 如何使用密码在远程计算机上创建文件夹
- c++ - OpenCV,通过引用传递 Mat,并改变它的类型
- asp.net - 我们可以在每个函数中对这些重复的代码做些什么吗?
- javascript - TypeScript - 实用方法中的错误
- javascript - 在jQuery中将localStorage数据更改为html列表标签
- java - 未在 OpenGL ES 3.0 中渲染的无纹理四边形
- apache-flink - Flink 如何动态添加第三方依赖?
- kubernetes - 如何获取一堆短期 Kubernetes 作业的指标
- css - 如何解决 Google Search Console 中“可点击元素靠得太近”的问题
- git - 如何对他人的回购大师提出拉取请求?(已创建新分支)