【问题标题】:ListView gets empty when back icon is clicked单击后退图标时,ListView 为空
【发布时间】:2015-03-24 09:36:07
【问题描述】:

我有两个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;

        }
    }


} 

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

感谢任何帮助。

非常感谢。

【问题讨论】:

  • 您的列表正在清除,我认为问题是当您单击操作栏后退按钮时,主要活动被再次调用或再次创建。您的列表中没有任何内容。
  • 你是如何实现从 ListActivity 到 MainActivity 的导航的?
  • @Jitain 谢谢你的回答,你能告诉我如何解决这个问题吗?
  • @dit 我没有实现从 ListActivity 到 MainActivity 的任何自定义导航,因为这将使用后退按钮执行。对于从 MainActivity 到 ListActivity 的导航,我传递了一个包含 ArrayList 的意图
  • @Karthika 提供的答案很好,但可能会导致大型应用程序出现内存泄漏。而是您可以做的,使您的主要活动成为单一实例或将您的旧活动置于前台。

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


【解决方案1】:

创建一个类Constantss.java并声明

public static ArrayList <String> itemList=null;

然后在你的班级里

使用

Constantss. itemList.add(name);

而不是

itemList.add(name);

// 将 itemList 替换为 Constantss。您所有课程中的 itemList

【讨论】:

  • 谢谢,但是你能告诉我这将如何解决问题吗?我在代码中有什么错误?谢谢
  • @Dania 本地数组列表(在类中声明的数组列表)不会始终保留其中的值。因此,如果将其设为全局静态,则可以使用它直到您刷新应用程序(按退出/主页应用程序的按钮)。您也可以避免使用 intent.putExtra("list", itemList);如果您遵循此方法,您也可以在第二个类中调用 Constantss.itemlist 而不是从意图中获取它。
  • 非常感谢您的回答,现在我的应用程序运行正常。我已经应用了您刚刚在 MainActivity 中解释的全局静态变量概念。因此,我没有在 oncreate 中声明它,而是将其声明为静态全局变量。但是,即使我退出并重新打开应用程序,列表也会正确显示。即使在我关闭应用程序后静态变量也会持续存在吗?谢谢
  • @Dania 它将一直存在,直到您从任务管理器中清除它或再次从 eclipse/studio 运行该应用程序。
  • 请记住。这不是正确的方法。您可以将其仅用于测试。 Android 可能会关闭您的应用,因为它需要更多资源用于其他应用。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2015-12-04
    • 2020-05-19
    相关资源
    最近更新 更多