单击后退图标时,ListView变为空

时间:2015-03-24 09:36:07

标签: android listview android-fragments android-arrayadapter android-lifecycle

我有两个activities,主要有一个text field和两个buttons,用户可以在text field中输入文字。

点击添加button后,文字会添加到某些ArrayList

单击“在列表中显示”按钮时,应打开包含其自己的片段的新活动,显示包含用户输入的名称的listview

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

这是主要的活动代码,

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;

        }
    }


} 

任何人都可以告诉我为什么会这样吗?我该如何解决这个问题?

感谢任何帮助。

非常感谢。

2 个答案:

答案 0 :(得分:1)

创建一个Constantss.java类并声明

public static ArrayList <String> itemList=null;

然后在你的课堂内

使用

Constantss. itemList.add(name);

而不是

itemList.add(name);

//用Constantss替换itemList。所有类中的itemList

答案 1 :(得分:0)

我认为这是导航问题。所以你应该像这样关闭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