Android 启动“活动”时未填充ListView项
以下是我的设想: 我有一个Android 启动“活动”时未填充ListView项,android,listview,android-listview,Android,Listview,Android Listview,以下是我的设想: 我有一个main活动和一个CustomListViewActivity。在我的主要活动中,我有一个按钮和一个微调器。单击按钮后,我通过Bundle并使用Intents将所选微调器值传递给CustomListViewActivity 现在,在CustomListViewActivity中,我有一个ListView,它使用ArrayAdapter来填充它。例如,我从MainActivity发送一个ArrayList items = [abc] 在我的CustomListView
main活动
和一个CustomListViewActivity
。在我的主要活动中,我有一个按钮和一个微调器。单击按钮后,我通过Bundle
并使用Intents
将所选微调器值传递给CustomListViewActivity
现在,在CustomListViewActivity中,我有一个ListView,它使用ArrayAdapter
来填充它。例如,我从MainActivity发送一个ArrayList
items = [abc]
在我的CustomListViewActivity中,我收到相同的消息并使用它填充我的ListView。第一次这样做时,我的值会被填充。第二次执行相同操作时,现有的值现在被替换为新的值,并且ListView显示一项而不是两项
所以基本上问题是ListView没有更新,也没有显示这两个项目。相反,它总是向我显示一个项目
下面是我的代码片段
MainActivity.java
//内部代码按钮点击
..
{
items.add(spinner1.getSelectedItem().toString());
Bundle bundle =new Bundle();
bundle.putStringArrayList("data",items);
Intent i = new Intent(MainActivity.this,MyListViewActivity.class);
i.putExtras(bundle);
startActivity(i);
finish();
}
protected void onSaveInstanceState(Bundle icicle) {
super.onSaveInstanceState(icicle);
Log.i("App","onSave");
icicle.putStringArrayList("data",items);
}
@Override
protected void onRestoreInstanceState(Bundle icicle2) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(icicle2);
Log.i("App","onRestore");
icicle2.putStringArrayList("data",items);
}
MyListViewActivity.java
private ArrayList<String> myItems;
private static String[] titles;
CustomListViewAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_main);
listView = (ListView) findViewById(R.id.list1);
rowItems = new ArrayList<RowItem>();
adapter = new CustomListViewAdapter(this,R.layout.list_item, rowItems);
listView.setAdapter(adapter);
b=getIntent().getExtras();
if(b!=null)
{
myItems=b.getStringArrayList("data");
titles= new String[myItems.size()];
titles = myItems.toArray(myItems);
}
...
int i=0;
while(i<titles.length) {
item = new RowItem(titles[i]);
//rowItems.add(item);
Log.i("ROW", ""+rowItems.size());
i++;
adapter.add(item);
listView.setAdapter(adapter);
}
adapter.setNotifyOnChange(true);
adapter.notifyDataSetChanged();
}
}
private ArrayList myItems;
私有静态字符串[]标题;
自定义列表视图适配器;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.list_main);
listView=(listView)findViewById(R.id.list1);
rowItems=新的ArrayList();
adapter=新CustomListViewAdapter(此,R.layout.list_项,行项);
setAdapter(适配器);
b=getIntent().getExtras();
如果(b!=null)
{
myItems=b.getStringArrayList(“数据”);
titles=新字符串[myItems.size()];
标题=myItems.toArray(myItems);
}
...
int i=0;
而(i您需要在MainActivity的onSaveInstanceState
和onRestoreInstanceState
方法中持久化和恢复项
您也可能不需要在每次启动ListView活动时调用finish()来关闭MainActivity,但这取决于您的应用程序
基本上,您遇到的问题是,items
正在使用MainActivity的每个新实例重新创建。由于您完成了MainActivity,每次访问该活动时都会使用一个新实例(我假设您认为items只会不断向其中添加项).ok,在这种情况下,我需要在MainActivity中添加这两个方法并添加bundle.putStringArrayList(“数据”,items);在它们里面,对吗?你认为MyListViewActivity可以吗?我的意思是说有什么变化吗?MyListViewActivity中的onResume方法呢?MyListViewActivity很好。如果你在适配器上使用“add”方法添加行项目,你就不需要onResume中的任何代码。如果你想让手册通知我,我会uld在您的while(iI)编辑了我的代码并根据您的评论添加了一些更改后,将notifyDataSetChanged()调用移动到。但是,我在列表中仍然只得到1项:(请检查上面的代码,您可能误解了我。在onRestoreInstanceState中,您希望从捆绑包中获取项。Try items=icicle2.getStringArrayList(“数据”);