Android 当应用程序重新启动时,如何在ArrayList中保存项目?(安卓)

Android 当应用程序重新启动时,如何在ArrayList中保存项目?(安卓),android,Android,每当我重新启动应用程序时,我在ArrayList运行时保存在其中的所有信息都会被删除。此外,有时当我参加另一项活动,然后从第二项活动回来时。信息再次被删除。我不确定是什么原因造成的。我希望信息永久保存,除非被用户删除。通常,当我需要从ArrayList调用项时,我收到的错误是IndexOutOfBounds异常 主要活动代码: public class MainActivity extends AppCompatActivity implements View.OnClickListener {

每当我重新启动应用程序时,我在ArrayList运行时保存在其中的所有信息都会被删除。此外,有时当我参加另一项活动,然后从第二项活动回来时。信息再次被删除。我不确定是什么原因造成的。我希望信息永久保存,除非被用户删除。通常,当我需要从ArrayList调用项时,我收到的错误是IndexOutOfBounds异常

主要活动代码:

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);