在Android中更改活动时如何保持ArrayList值

时间:2018-07-15 01:55:48

标签: java android arrays android-studio arraylist

这是ViewActivity

public class ViewActivity extends AppCompatActivity {

    private ListView lvPerson;
    private PersonListAdapter adapter;
    public List<Person> mPersonList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view);

        lvPerson = (ListView)findViewById(R.id.listView);

        //Add new person
        Intent intent = getIntent();
        if(intent.hasExtra("add")){
            String name = intent.getStringExtra("name");
            String email = intent.getStringExtra("email");
            String address = intent.getStringExtra("address");
            mPersonList.add(new Person(name, email, address));
            Toast.makeText(getApplicationContext(), "Data berhasil ditambahkan", Toast.LENGTH_SHORT).show();
        }

        //Init adapter
        adapter = new PersonListAdapter(getApplicationContext(), mPersonList);
        lvPerson.setAdapter(adapter);

    }
}

这是InputActivity

public class InputActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_input);
    }

    public void saveButtonClicked(View view){

        EditText name = (EditText) findViewById(R.id.editTextName);
        EditText email = (EditText) findViewById(R.id.editTextEmail);
        EditText address = (EditText) findViewById(R.id.editTextAddress);

        String strName = name.getText().toString();
        String strEmail = email.getText().toString();
        String strAddress = address.getText().toString();

        Intent intent = new Intent(this, ViewActivity.class);
        intent.putExtra("add", true);
        intent.putExtra("name", strName);
        intent.putExtra("email", strEmail);
        intent.putExtra("address", strAddress);
        startActivity(intent);

    }
}

显示我的流程是在InputActivity中单击保存按钮时,它将在ViewActivity中运行“添加人”代码,并将数据从表单添加到ArrayList。

这是可行的,但是当我使用Intent更改活动并回到ViewActivity时,ArrayList数据消失了。

我想要的是保留我已经在InputActivity中输入的所有值。

希望你明白我的意思:)

5 个答案:

答案 0 :(得分:2)

在InputActivity中覆盖onSaveInstanceState(Bundle)以保存所需的任何数据,然后在同一活动中覆盖onRestoreInstanceState(Bundle)以取回值。使用捆绑软件,您可以存储几乎任何所需的数据。我建议这样的东西:

public class ViewActivity extends AppCompatActivity {

private ListView lvPerson;
private PersonListAdapter adapter;
public List<Person> mPersonList = new ArrayList<>();

@Override 
protected void onSaveInstanceState (Bundle outState) { 
    outState.putStringArrayList("mPersonList", mPersonList); //I assume you want to mPersonList
}

@Override
protected void onRestoreInstanceState (Bundle savedInstanceState) {
    this.mPersonList = savedInstanceState.getStringArrayList("mPersonList"); //on coming back retrieve all values using key
        }

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_view);

    lvPerson = (ListView)findViewById(R.id.listView);

    //Add new person
    Intent intent = getIntent();
    if(intent.hasExtra("add")){
        String name = intent.getStringExtra("name");
        String email = intent.getStringExtra("email");
        String address = intent.getStringExtra("address");
        mPersonList.add(new Person(name, email, address));
        Toast.makeText(getApplicationContext(), "Data berhasil ditambahkan", Toast.LENGTH_SHORT).show();
    }

    //Init adapter
    adapter = new PersonListAdapter(getApplicationContext(), mPersonList);
    lvPerson.setAdapter(adapter);

}
}

答案 1 :(得分:2)

您正在做的事情实际上非常糟糕,因为您只是为要添加和创建的每个人员创建一个接一个的活动。浪费内存和功率。

相反,您应该寻找的仅仅是将InputActivity的结果返回给ViewActivity。

在您的ViewActivity中,不要调用startActivity(intent),而要使用startActivityForResult(intent, REQUEST_CODE)。然后覆盖onActivityResult(),以便您可以处理返回到ViewActivity的结果。

在InputActivity中,不要调用startActivity(),而是将意图返回给ViewActivity。

一个例子如下:

ViewActivity

public class ViewActivity extends AppCompatActivity {

    private ListView lvPerson;
    private PersonListAdapter adapter;
    public List<Person> mPersonList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view);

        lvPerson = (ListView)findViewById(R.id.listView);

        //Init adapter
        adapter = new PersonListAdapter(getApplicationContext(), mPersonList);
        lvPerson.setAdapter(adapter);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode == RESULT_OK){
            String name = data.getStringExtra("name");
            String email = data.getStringExtra("email");
            String address = data.getStringExtra("address");
            mPersonList.add(new Person(name, email, address));
            adapter.notifyDataSetChanged();
            Toast.makeText(getApplicationContext(), "Data berhasil ditambahkan", Toast.LENGTH_SHORT).show();
        }
    }

}

InputActivity

public class InputActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_input);
    }

    public void saveButtonClicked(View view){

        EditText name = (EditText) findViewById(R.id.editTextName);
        EditText email = (EditText) findViewById(R.id.editTextEmail);
        EditText address = (EditText) findViewById(R.id.editTextAddress);

        String strName = name.getText().toString();
        String strEmail = email.getText().toString();
        String strAddress = address.getText().toString();

        Intent intent = new Intent();
        intent.putExtra("add", true);
        intent.putExtra("name", strName);
        intent.putExtra("email", strEmail);
        intent.putExtra("address", strAddress);
        setResult(RESULT_OK, intent);
        finish();    
    }
}

以这种方式进行操作可避免再次创建ViewActivity,因此您不必重新创建所有视图并重新填充列表。您只需重复使用现有的ViewActivity并将结果添加到现有列表即可。

答案 2 :(得分:2)

这里有一些很好的答案,但是由于您只希望它在一个应用会话中持续存在,因此我将添加另一种方法,即使用单例来保存数据:

class DataHolder {
    final List<Person> people = new ArrayList<>;

    private DataHolder() {}

    static DataHolder getInstance() {
        if( instance == null ) {
            instance = new DataHolder();
        }
        return instance;
    }

    private static DataHolder instance;
}

在任一活动(或应用程序中的任何位置)中,您都可以使用

访问人员列表
List<Person> ppl = DataHolder.getInstance().people;

例如,您将替换

public List<Person> mPersonList = new ArrayList<>();

使用

// not sure why that was public...
private List<Person> mPersonList = DataHolder.getInstance().people;

它只会在您当前的应用会话中持续,但是如果您以后想保存它们,可以在DataHolder中添加一个后端数据库,这样每次添加一个人时,它都会自动保存在某个地方。

答案 3 :(得分:1)

如果我对您的理解正确,那么您的流程如下: 1.)ViewActivity->意向-> InputActivity 2.)InputActivity->意向-> ViewActivity

在这种情况下,您应该阅读有关Android中“活动生命周期”的更多信息: https://developer.android.com/guide/components/activities/activity-lifecycle

简而言之: onCreate仅在创建ViewActivity时被调用。如果从那里转到InputActivity,然后返回-> ViewActivity已经存在,因此不会调用oncreate。

我想到的一个解决方案是startActivityForResult。以下是有关如何使用它的示例: How to manage `startActivityForResult` on Android?

另一个一般性提示,似乎您对android开发还相当陌生:大量使用断点和Log(https://developer.android.com/reference/android/util/Log)可以更好地了解发生事情的地点和时间。并且不仅要使用教程来开始在Android中进行开发。阅读一些初学者指南/书并没有什么害处,该指南/书更详细地说明了一些Android细节(例如Activity-Lifecycle)

答案 4 :(得分:0)

您可以使用Gson / Jackson /或其他任何东西将其序列化为字符串,然后使用[SharedPreferences][1]保存。然后在新活动中,您只需将其从SharedPreferences重新加载。