【问题标题】:How to restore the ListView and get Contents of List when back button in pressed?按下后退按钮时如何恢复 ListView 并获取 List 的内容?
【发布时间】:2016-10-17 09:16:22
【问题描述】:

ActivityB --> 服务类 --> 在ActivityC中填充ListView(如下图,没有片段)---> ActivityD

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0);
    setLocale(pref.getString("myLocale", null));

    setTitle(R.string.title_activity_choose_number);
    setContentView(R.layout.activity_choose_number1);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    if(savedInstanceState != null ) {
        mobileNumbersList = savedInstanceState.getStringArrayList("mobileNumbers");
    }
    mobileNumbersList = getIntent().getStringArrayListExtra("mobileNumbers");

    mobileNumberAdapter = new ArrayAdapter<String>(this,
            R.layout.secnumsinglechoice,
            mobileNumbersList);

    numberListView = (ListView) findViewById(R.id.listViewNumberList);
    numberListView.setAdapter(numberAdapter);
    numberListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String numberChosen = numberAdapter.getItem(position);
            Intent passNumberIntent = new Intent(getBaseContext(), US.class).
                    putExtra(Intent.EXTRA_TEXT, numberChosen);
            startActivity(passNumberIntent);
        }
    });
}

现在,当在 ActivityD 中按下返回按钮到 ActivityC 时,我收到空指针错误。我知道原因是因为这一次,我没有从 ActivityD 和 ListView 传递意图,适配器,数据全部为空。

所以当我搜索如何保存状态时,我遇到了 saveInstanceState、onRestoreInstance 和 onSaveInstance。但我仍然无法解决这个问题。 ActivityC 没有片段。

【问题讨论】:

  • saveInstanceState 是为了在后台返回时恢复活动数据,它与前进或后退导航无关,如果您的活动需要来自上一个活动的数据,您应该将其存储在一个类字段中并检查如果它在尝试读取意图数据之前设置。
  • /你所说的活动数据是什么意思?这里发生的问题是当我从 ActivityD 导航到 ActivityC 时,我丢失了活动 C 数据。类字段你的意思是像 Intent ????
  • 类字段是直接在您的类上声明的变量,将您的 ActivityC 数据存储在 ActivityC 上的字段中,以便您可以在需要时恢复它。
  • @Nanoc 是的,类变量 tick 就像一个魅力。 stackoverflow.com/a/29229401/3705478 谢谢。 “静态”的力量:)
  • 但是创建一个类级别的静态变量,它会显示一个警告,即类级别的静态是内存泄漏。它还说安全问题。但它是一个警告。我应该担心吗?

标签: android listview android-fragments android-adapter


【解决方案1】:

你应该做两件事:

  • 检查getIntent() 是否为空。如果不为空,尝试从中获取数据
  • 将数据放入方法public void onSaveInstanceState(Bundle savedInstanceState)上的savedInstanceState变量中

【讨论】:

  • 我尝试使用 onSaveInstanceState 将数据放入 savedInstanceState 但不起作用。
  • 您能详细介绍一下您的活动 C 吗?也许,当您从活动 D -> 活动 C 导航回来时,活动 C 会跳转到 onResume(),因为它还没有被销毁。尝试在 logcat 中检查您的活动生命周期以查看它。
猜你喜欢
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
相关资源
最近更新 更多