【发布时间】:2014-03-25 14:19:56
【问题描述】:
当应用启动时,我从设备的 SD 卡中加载一些对象并将它们添加到 ListView。
Objects = new ArrayList<DataObject>();
Items = new ArrayList<MenuItem>();
Adapter = new MenuItemAdapter(this, Items);
listView.setAdapter(Adapter);
LoadObjects();
当我加载对象时,我会反序列化对象,检查它的唯一 ID,如果它已经在对象列表中,则不应添加它。我的方法 LoadObjects 加载尝试加载具有给定扩展名的目录中的所有文件。然后,如果成功,则尝试使用此方法将其加载到 Items 列表中:
private boolean LoadObject(DataObject obj)
{
for (DataObject do : Objects)
{
if (do.GetID().equals(obj.GetId())
return false;
}
boolean added = Objects.add(do);
if (added)
{
Items.add(new MenuItem(do.GetID(), do.GetName());
Adapter.notifyDataSetChanged();
}
return added;
}
当此方法运行“onCreate”时,它工作正常,它会加载所有可以加载并存储在 SD 卡上的对象。当我尝试在此方法之后添加一个时,第一个项目出现在应添加新项目的列表中。我用一个Dialog输入一个新的名字来创建一个新的DataObject,后面会调用LoadObject(new DataObject(name));
我试过了:
重置项目适配器
在自定义适配器上添加一个“添加”方法,这样我就不用添加到项目中,而是通过适配器添加适配器。添加(新数据对象(名称))添加到它自己的列表中;我还有一个 SetList 适配器,可以重新创建列表但没有成功。
跳过 notifyDataSetChanged
清除了对象列表、项目列表,每次都创建一个新的适配器 - 重新加载所有对象、所有菜单项、重新创建适配器并设置一个新列表 - 都具有相同的结果。
跳过 LoadObjects() 并让所有新添加的项目出现,第一个是正确的 - 但我稍后添加的任何内容都显示为与 ListView 中的 #1 相同。
我必须使用 FragmentActivity 而不是 ListActivity,因为我需要显示一些对话框。
简单地说,我使用 ListView 来显示 SD 卡中的特定文件,以便以后能够将它们加载到另一个 Activity 中 - 但这阻碍了我添加任何新项目而无需重新启动 Activity 以显示新项目,这意味着我需要能够从一个空列表开始,然后
【问题讨论】:
标签: android android-listview android-arrayadapter listadapter dynamically-generated