将数据保存在活动中的arraylist中

eqfvzcg8  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(389)

我是一个新的安卓程序员。我有4个活动:a b c d。使用按钮的顺序是a->b->c->d->a和a->d。我想将数据保存在活动d中的arraylist中。问题是,当我从d移到a并返回d时,arraylist中的数据没有保存。此处为d活动的代码:

public class SchedulerActivity extends AppCompatActivity {

    public String name = "";
    public String number = "";
    public String date = "";
    public String hour = "";
    public ArrayList<EventClass> scheduler = new ArrayList<>();

    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scheduler);
        Bundle extras = getIntent().getExtras();

        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(SchedulerActivity.this, MainActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(intent);
                finish();
            }
        });
        if (extras != null) {
            String sender = extras.getString("sender");
            if(sender.compareTo("Hours") == 0) {
                name = extras.getString("name");
                number = extras.getString("number");
                date = extras.getString("date");
                hour = extras.getString("hour");
                Date real_date = new Date();
                SimpleDateFormat formatter1=new SimpleDateFormat("dd/MM/yyyy");
                try {
                    real_date = formatter1.parse(date);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                scheduler.add(new EventClass(real_date, name, number, "", hour));
                for (EventClass event : scheduler){
                    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.MATCH_PARENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT);
                    final TextView t = new TextView(this);
                    t.setText(event.toString());
                    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linearLayout);
                    linearLayout.addView(t, params);
                }

            }
            else{
                for (EventClass event : scheduler){
                    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.MATCH_PARENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT);
                    final Button btn = new Button(this);
                    final TextView t = new TextView(this);
                    t.setText(event.toString());
                    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linearLayout);
                    linearLayout.addView(btn, params);
                }
            }
        }
    }

我想在c->d出现时更改我的arraylist并打印它,当d->a出现时我只想打印它。我知道我可以使用sharedpreferences,但是第一步,我想使用arraylist。最好的办法是什么?

kyxcudwk

kyxcudwk1#

一个好的方法是将数据保存在本地数据库中,比如room。您需要先保存,然后再转到新活动,并在onresume()上重新获取它。

sqougxex

sqougxex2#

创建静态对象不是一个好方法。因此,您可以使用android活动堆栈来代替静态arraylist。android活动存储在活动堆栈中。回到以前的活动可能意味着两件事。
您使用startactivityforresult从另一个活动打开了新活动。在这种情况下,您只需从代码中调用finishactivity()函数,它就会将您带回上一个活动。跟踪活动堆栈。每当您开始一个有意图的新活动时,您都可以指定一个意图标志,如标志\u activity \u reorder \u to \u front或标志\u activity \u previous \u is \u top。您可以使用它在应用程序中的活动之间切换。

wlwcrazw

wlwcrazw3#

scheduler是scheduleractivity中的一个非静态字段,这意味着它的存在与活动的示例相关联。当活动示例被销毁时,例如当屏幕方向被销毁或您移动到另一个活动时,它的所有非静态字段也会被销毁。您可以通过在字段前添加静态关键字来更改:

public static ArrayList<EventClass> scheduler = new ArrayList<>();

现在,字段绑定到类本身,而不是示例,这意味着它不会随示例一起被销毁。但这也意味着它在所有示例之间共享,并且必须用类主体之外的类名引用:

EventClass event = SchedulerActivity.scheduler.get(0)

相关问题