Android 当应用程序重新启动时,如何在ArrayList中保存项目?(安卓)
每当我重新启动应用程序时,我在ArrayList运行时保存在其中的所有信息都会被删除。此外,有时当我参加另一项活动,然后从第二项活动回来时。信息再次被删除。我不确定是什么原因造成的。我希望信息永久保存,除非被用户删除。通常,当我需要从ArrayList调用项时,我收到的错误是IndexOutOfBounds异常 主要活动代码:Android 当应用程序重新启动时,如何在ArrayList中保存项目?(安卓),android,Android,每当我重新启动应用程序时,我在ArrayList运行时保存在其中的所有信息都会被删除。此外,有时当我参加另一项活动,然后从第二项活动回来时。信息再次被删除。我不确定是什么原因造成的。我希望信息永久保存,除非被用户删除。通常,当我需要从ArrayList调用项时,我收到的错误是IndexOutOfBounds异常 主要活动代码: public class MainActivity extends AppCompatActivity implements View.OnClickListener {
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView preset;
private Button add;
private ListView exercises;
private ArrayList<String> exerciseName;
public ArrayList<Exercise> Exercises;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Exercises = new ArrayList<Exercise>();
preset = findViewById(R.id.preset_title);
add = findViewById(R.id.add_exercise);
exercises = findViewById(R.id.exercises);
exerciseName = FileHelper.readData(this);
this.adapter = new MyAdapter(exerciseName, this, Exercises);
exercises.setAdapter(adapter);
add.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.add_exercise:
final int CODE = 1;
Intent i = new Intent(this, add_activity.class);
startActivityForResult(i, CODE);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case 1:
if(resultCode == RESULT_OK && data != null) {
Bundle passBack = data.getExtras();
Exercise exercise = passBack.getParcelable("exercise");
adapter.addData(exercise);
adapter.list.add(exercise.getName());
FileHelper.writeData(exerciseName, this);
adapter.notifyDataSetChanged();
}
case 2:
if (resultCode == RESULT_OK && data != null) {
Bundle passBack = data.getExtras();
Exercise exercise = passBack.getParcelable("exercise");
int position = passBack.getInt("position");
adapter.setData(exercise, position);
adapter.notifyDataSetChanged();
}
}
}
}
public类MainActivity扩展AppCompatActivity实现View.OnClickListener{
私有文本视图预设;
私人按钮添加;
私人列表视图练习;
私有ArrayList exerciseName;
公共阵列列表练习;
专用MyAdapter适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
练习=新建ArrayList();
预设=findViewById(R.id.preset\U标题);
add=findViewById(R.id.add\u练习);
练习=findViewById(R.id.练习);
exerciseName=FileHelper.readData(此);
this.adapter=新的MyAdapter(exerciseName、this、Exercises);
练习.设置适配器(适配器);
add.setOnClickListener(这个);
}
@凌驾
公共void onClick(视图){
开关(view.getId()){
案例R.id.add_练习:
最终整数代码=1;
意向i=新意向(此,添加活动.class);
startActivityForResult(一,代码);
打破
}
}
@凌驾
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
super.onActivityResult(请求代码、结果代码、数据);
开关(请求代码){
案例1:
if(resultCode==RESULT\u OK&&data!=null){
Bundle passBack=data.getExtras();
练习=passBack.getParcelable(“练习”);
adapter.addData(练习);
adapter.list.add(exercise.getName());
FileHelper.writeData(exerciseName,this);
adapter.notifyDataSetChanged();
}
案例2:
if(resultCode==RESULT\u OK&&data!=null){
Bundle passBack=data.getExtras();
练习=passBack.getParcelable(“练习”);
int position=passBack.getInt(“position”);
adapter.setData(练习、位置);
adapter.notifyDataSetChanged();
}
}
}
}
自定义适配器代码(存储我的ArrayList数据的位置):
公共类MyAdapter扩展了ArrayAdapter{
公共阵列列表;
私人语境;
私有文本视图列表;
私有数组列表数据;
公共MyAdapter(ArrayList记录、上下文上下文、ArrayList数据){
超级(上下文,0,记录);
this.list=记录;
这个数据=数据;
this.context=上下文;
}
公共数据(练习d){
数据.添加(d);
}
公共无效设置数据(练习d,整数位置){
数据集(位置,d);
}
@凌驾
公共视图getView(最终整型位置、视图转换视图、最终视图组父视图){
if(convertView==null){
convertView=LayoutInflater.from(getContext()).flate(R.layout.listview_custom,parent,false);
}
按钮列表\u but=(按钮)convertView.findViewById(R.id.list\u but);
TextView列表_-txt=(TextView)convertView.findViewById((R.id.list_-txt));
按钮编辑=(按钮)convertView.findViewById(R.id.list_but2);
按钮开始=(按钮)convertView.findViewById(R.id.list_but3);
list_txt.setText(list.get(position));
edit.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
最终整数代码2=2;
活动来源=(活动)上下文;
意图编辑=新意图(parent.getContext(),add_activity.class);
Bundle newBundle=新Bundle();
newBundle.putParcelable(“exercise”,data.get(position));
纽班德。普廷(“位置”,位置);
编辑.附加(新绑定);
origin.startActivityForResult(编辑,代码2);
}
});
start.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Intent start=newintent(parent.getContext(),timer\u activity.class);
start.putExtra(“exercise”,data.get(position));
parent.getContext().startActivity(开始);
}
});
list_but.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
AlertDialog.Builder alert=新建AlertDialog.Builder(上下文);
警报。设置标题(“删除?”);
setMessage(“您确定要删除此练习吗?”);
alert.setPositiveButton(“是”,新的DialogInterface.OnClickListener(){
@凌驾
公共void onClick(DialogInterface,inti){
列表。删除(位置);
试一试{
数据删除(位置);
}捕获(IndexOutOfBoundsException ex){
}
notifyDataSetChanged();
}
});
alert.setNegativeButton(“否”,新的DialogInterface.OnClickListener(){
@凌驾
公共void onClick(DialogInterface,inti){
public class MyAdapter extends ArrayAdapter<String> {
public ArrayList<String> list;
private Context context;
private TextView list_txt;
private ArrayList<Exercise> data;
public MyAdapter(ArrayList<String> records, Context context, ArrayList<Exercise> data) {
super(context, 0, records);
this.list = records;
this.data = data;
this.context = context;
}
public void addData(Exercise d){
data.add(d);
}
public void setData(Exercise d, int position) {
data.set(position, d);
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.listview_custom, parent, false);
}
Button list_but = (Button) convertView.findViewById(R.id.list_but);
TextView list_txt = (TextView) convertView.findViewById((R.id.list_txt));
Button edit = (Button) convertView.findViewById(R.id.list_but2);
Button start = (Button) convertView.findViewById(R.id.list_but3);
list_txt.setText(list.get(position));
edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final int CODE2 = 2;
Activity origin = (Activity)context;
Intent edit = new Intent(parent.getContext(), add_activity.class);
Bundle newBundle = new Bundle();
newBundle.putParcelable("exercise", data.get(position));
newBundle.putInt("position", position);
edit.putExtras(newBundle);
origin.startActivityForResult(edit, CODE2);
}
});
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent start = new Intent(parent.getContext(), timer_activity.class);
start.putExtra("exercise", data.get(position));
parent.getContext().startActivity(start);
}
});
list_but.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder alert = new AlertDialog.Builder(context);
alert.setTitle("Delete?");
alert.setMessage("Are you sure you want to delete this exercise?");
alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
list.remove(position);
try {
data.remove(position);
} catch(IndexOutOfBoundsException ex) {
}
notifyDataSetChanged();
}
});
alert.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
alert.create().show();
}
});
return convertView;
}
}
Gson gson = new Gson();
String exercisesJSON = gson.toJson(Exercises);
SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("KEY_BETTER_USE_CONST", exercisesJSON);
editor.commit();
SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
String exercisesJSON = sharedPref.getInt("KEY_BETTER_USE_CONST", "DEFAULT_VALUE_EMPTY");
//check if exercisesJSON is equal to "DEFAULT_VALUE_EMPTY" if yes, init array as empty, if not deserialize it using gson
Gson gson = new Gson();
Exercises[] exercises = gson.fromJson(exercisesJSON, Exercise[].class);