单击后退图标时 ListView 变空

ListView gets empty when back icon is clicked

我有两个activities,主要的我有一个text field和两个buttons,用户可以在text field.[=23中输入文字=]

单击添加 button 时,文本将添加到某些 ArrayList

单击“在列表中显示”按钮时,应该会打开一个带有自己的片段的新 activity,显示包含用户输入的名称的 listview

我使用了 ArrayAdapter 并且效果很好。当我在列表 activity 中并单击设备的 后退按钮 时一切正常并且 ArrayList 中的数据没有丢失。 如果我再次点击在列表中显示,我会找到我第一次输入的旧数据。但是,如果我单击设备屏幕左上角 Android 提供的 后退图标 ArrayList 变为空,当我单击在列表中显示时listview 显示为空。

这是主要的 activity 代码,

public class MainActivity extends ActionBarActivity {


    String LOG_TAG = this.getClass().getSimpleName();

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


        final ArrayList<String> itemList= new ArrayList<String>();


        final EditText text = (EditText) findViewById(R.id.text_field);
        text.setHint("Enter name here");
        Button addButton = (Button) findViewById(R.id.add_button);
        Button showButton = (Button) findViewById(R.id.show_button);

        addButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String name=  text.getText().toString();
                itemList.add(name);
                if (itemList.size()==1){
                    Toast.makeText(getApplicationContext(), "one", Toast.LENGTH_SHORT).show();
                }
                Toast.makeText(getApplicationContext(), "name has been added to the list", Toast.LENGTH_SHORT).show();
           }
        });

        showButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent (getApplicationContext(), ListActivity.class);
                intent.putExtra("list", itemList);
                startActivity(intent);
            }
        });

    }//end oncreate

这是ListActivity及其片段代码,

public class ListActivity extends ActionBarActivity {
    static ArrayList <String> itemList;
    String LOG_TAG = this.getClass().getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        itemList= getIntent().getStringArrayListExtra("list");
        setContentView(R.layout.list_activity);
         if (savedInstanceState==null){
             getSupportFragmentManager().beginTransaction().add(R.id.container, new list()).commit();
         }

    }

    public static class list extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
           View rootView = inflater.inflate(R.layout.fragment_main, container,false);
           ListView listView = (ListView) rootView.findViewById(R.id.list);

            ArrayAdapter <String> adapter= new ArrayAdapter<String>(getActivity(),R.layout.fragment_main, R.id.row, itemList);
            listView.setAdapter(adapter);

            return rootView;

        }
    }


} 

谁能告诉我为什么会这样?我该如何解决这个问题?

感谢任何帮助。

非常感谢。

创建一个 class Constantss.java 并声明

public static ArrayList <String> itemList=null;

然后在你的 class

里面

使用

Constantss. itemList.add(name);

而不是

itemList.add(name);

// 将 itemList 替换为 Constantss。您所有 classes

中的 itemList

我认为这是一个导航问题。所以你应该像这样关闭你的 ListActivity:

public class ListActivity extends ActionBarActivity {

    //your code

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int itemID = item.getItemId();

        switch (itemID ) {
            case android.R.id.home:
                this.finish();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

无论如何,如果 android 破坏了您的 MainActivity,您的数据可能会丢失。因此,如果您从 ListActivity 导航回 MainActivity,MainActivity 将被重新创建并且您的数据会丢失。所以你应该找到方法来保存你的 数据永久。

有两种常见的方式:

  1. 将数据保存到数据库 (SQLite)
  2. 将数据保存到首选项How to store list of values in SharedPreferences