Android ArrayAdapter、ListView、创建和更新内容
我再次发布此消息,试图让问题更清楚:Android ArrayAdapter、ListView、创建和更新内容,android,arraylist,android-listview,android-arrayadapter,Android,Arraylist,Android Listview,Android Arrayadapter,我再次发布此消息,试图让问题更清楚: ListView lv; List<Item> items; Localstorage ls; RemoteStorage rs; ItemArrayAdapter adapter; ... getShoppingList(); // <--- this method populates the items ArrayList adapter = new ItemArrayAdapter(getApplicationContext()
ListView lv;
List<Item> items;
Localstorage ls;
RemoteStorage rs;
ItemArrayAdapter adapter;
...
getShoppingList(); // <--- this method populates the items ArrayList
adapter = new ItemArrayAdapter(getApplicationContext(), R.layout.item_listitem,
items); // <--- Create an ArrayAdapter and insert the
// ArrayList...
lv.setAdapter(adapter);
但是,用于更新适配器的行(在更新项之后)完全没有任何作用。我知道条目会被更新,因为它也会被写入一个文件,所以问题并不存在。此外,如果我将用于更新适配器的行替换为用于重新创建适配器的行,那么效果会很好
更新(2012年9月16日):
ls.getShoppingList()方法:
很明显,他没有这样做。那么,如何使用更新的项目ArrayList更新适配器和ListView呢?不重新初始化适配器,即
编辑:
items ArrayList会随之更新:
if (((Button)v).getText().equals("Update")) {
try {
tmpitems = rs.getNewEntries(cdate, latestitem);
if (tmpitems.size() > 0) {
ls.UpdateLocalList(tmpitems);
getShoppingList();
refreshList();
} else {
updateFooter("No new items found on server.");
}
} catch (NullPointerException npe) {
Log.e(DEBUG_TAG, "NPException i onClick(): " + npe.toString());
updateFooter("No new items found on server.");
}
}
refreshList() {
adapter.setNotifyOnChange(true);
adapter.notifyDataSetChanged();
}
-新项目将被读入tmpitems ArrayList。
-如果新项目的数量大于0,则使用tmpitems更新本地文件。
-然后从本地文件更新items ArrayList(使用getShoppingList()方法,该方法添加
新条目)
-然后我尝试运行refreshList()方法,该方法应该更新适配器,如上所述
将更新项目ArrayList,并更新本地文件。这只是适配器上的更新方法,我无法开始工作。初始化适配器时,项目会显示在列表视图中-更新时,新内容不会显示。使用((ItemArrayAdapter)lv.getAdapter()).notifyDataSetChanged()
而不是适配器.notifyDataSetChanged()
更新:
问题是,notifyDataSetChanged()
仅在适配器中的数据发生更改时才起作用,并且它会重新引发列表。在您的情况下,您需要在外部更改数据,因此必须在适配器内部更改数据
您需要将nlist.add(…)
替换为适配器的insert()
和remove()
方法:
关于其工作原理的一些说明:初始化适配器时,它只会将传递给它的项数组粘贴到它自己的项数组中。它不再知道对项目数组所做的更改。如何更新项目?你能发布一些代码吗?试试lv.getAdapter().notifyDataSetChanged();那一行给了我这个错误:“notifyDataSetChanged()方法对于类型ListAdapter是未定义的”,这不起作用-它给出了以下错误:“notifyDataSetChanged()方法对于类型ListAdapter是未定义的”,谢谢,但它仍然不起作用。在我重新启动应用程序并重新创建适配器之前,ListView仍然为空。然后向我们显示更新适配器中数据的代码。在上面的public void onClick(View v)方法中。我刚刚将“adapter.notifyDataSetChanged();”一行替换为“((ItemArrayAdapter)lv.getAdapter()).notifyDataSetChanged()”;我指的是这些方法:getShoppingList();updateLatestItem();
private void getShoppingList () {
items = ls.getShoppingList(SHOPPINGLIST_FILE, cdate);
}
public List<Item> getShoppingList (String filename, String date) {
String next[] = {};
List<Item> nlist = new ArrayList<Item>();
try {
InputStream in = ctx.openFileInput("shoppinglists.csv");
InputStreamReader isr = new InputStreamReader(in);
CSVReader reader = new CSVReader(isr);
for(;;) {
next = reader.readNext();
if(next != null) {
if (next[0].equals(date)) {
nlist.add(new Item(next[0], next[1], next[2],
next[3], next[4], next[5]));
}
} else {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
Log.e(DEBUG_TAG, "IOException in List(): " + e.toString());
}
return nlist;
}
List<Item> items;
ItemArrayAdapter adapter;
adapter = new ItemArrayAdapter(getApplicationContext(), R.layout.item_listitem,
items);
lv.setAdapter(adapter);
adapter.setNotifyOnChange(true);
adapter.notifyDataSetChanged();
if (((Button)v).getText().equals("Update")) {
try {
tmpitems = rs.getNewEntries(cdate, latestitem);
if (tmpitems.size() > 0) {
ls.UpdateLocalList(tmpitems);
getShoppingList();
refreshList();
} else {
updateFooter("No new items found on server.");
}
} catch (NullPointerException npe) {
Log.e(DEBUG_TAG, "NPException i onClick(): " + npe.toString());
updateFooter("No new items found on server.");
}
}
refreshList() {
adapter.setNotifyOnChange(true);
adapter.notifyDataSetChanged();
}