单击后退图标时 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 将被重新创建并且您的数据会丢失。所以你应该找到方法来保存你的
数据永久。
有两种常见的方式:
- 将数据保存到数据库 (SQLite)
- 将数据保存到首选项How to store list of values in SharedPreferences
我有两个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 将被重新创建并且您的数据会丢失。所以你应该找到方法来保存你的 数据永久。
有两种常见的方式:
- 将数据保存到数据库 (SQLite)
- 将数据保存到首选项How to store list of values in SharedPreferences