我再次发布这个,试图使问题/问题更清楚:
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);
到目前为止,代码填充了ArrayList项目,创建了一个适配器并将项目添加到其中,然后在ListView lv中显示它。到目前为止,一切都很好。
但是,getShoppingList()方法会运行多次,更新ArrayList项。而不是每次发生这种情况时都重新创建适配器,我只想更新它并在ListView lv中显示更新的内容。
我想说的是:
“更新”按钮的OnClick方法:
public void onClick(View v) {
if (((Button)v).getText().equals("Update")) {
try {
tmpitems = rs.getNewEntries(cdate, latestitem);
if (tmpitems.size() > 0) {
updateFooter(tmpitems.size() + " new items found on server!");
ls.UpdateLocalList(tmpitems);
getShoppingList();
updateLatestItem();
adapter.setNotifyOnChange(true); //
adapter.notifyDataSetChanged(); // THIS IS WHAT ISN'T WORKING
lv.setAdapter(adapter); //
} 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.");
}
然而,用于更新适配器的代码行(在项目被更新之后)完全不起作用。我知道items被更新了,因为它也被写到一个文件中,所以问题不在那里。此外,如果我用重新创建适配器的代码行替换更新适配器的代码行,它会工作得很好。
更新(2012年9月16日):
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;
}
-原始帖子-
我有一个ListView lv,带有一个ArrayAdapter,用于显示多行项目。
List<Item> items;
ItemArrayAdapter adapter;
adapter = new ItemArrayAdapter(getApplicationContext(), R.layout.item_listitem,
items);
lv.setAdapter(adapter);
这个很好用。items arraylist被填充,适配器在ListView中显示内容。
但是,然后我做了一些更新ArrayList项的事情。然后我想更新适配器和ListView。但是这段代码,
adapter.setNotifyOnChange(true);
adapter.notifyDataSetChanged();
显然没有。那么,如何用更新的条目ArrayList更新适配器,从而更新ListView?没有重新初始化适配器,那是什么?
编辑:
项目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数组列表。-如果新项目的数量为
条目数组列表被更新,本地文件也被更新。只是适配器上的更新方法我无法正常工作。初始化适配器时,ListView中会显示项目——更新时,新内容不会显示。
Use ((ItemArrayAdapter)lv.getAdapter()).notifyDataSetChanged()
而不是适配器
。
更新:问题是notifyDataSetChanged()
仅在适配器内的数据发生更改时才起作用,并且它会重新呈现列表。在您的情况下,您需要在外部更改数据,因此必须在适配器内部更改数据。
您需要替换< code>nlist.add(...)带有< code>insert()和< code>remove()方法的适配器:官方参考
关于它如何工作的一些说明:当你初始化适配器时,它只是把你传递给它的条目数组粘贴到它自己的数组中。它不再知道对您的项目数组所做的更改。
问题内容: 我有一个扩展ExpandableListActivity的活动。我使用SimpleCursorTreeAdapter填充ExpandableListView。我的布局包含列表视图和空视图。在应用启动时,ExpandableListActivity自动选择要显示的右视图。 我的步骤: 应用启动,没有数据。(屏幕上的空白视图) 将一些数据插入db。 调用adapter.notifyData
我正在寻找在Android中使用列表适配器和Recyview适配器的区别。关于性能的任何不同,使用它们的利弊。
我有一个带有按钮的视图和一个列表视图,由包含bindView()和newView()的光标适配器支持,用于自定义视图。列表的每一行都包含一个Text和一个复选框。每个视图的数据来自数据库。我正在光标适配器构造函数中传递我的数据库适配器。当复选框被选中或取消选中时,我用它来更新数据库(效果很好)。当然,我对光标运行“重新查询”并view.refreshDrawableState())。这是个好主意吗
我正在尝试为我的列表视图制作一个自定义适配器,但我在同一行上不断得到一个 RessourceNotFoundException。 首先,这是我的适配器类代码: 这是视图的xml,包含listview: 以及带有上述列表视图的项目布局的xml文件: 这是在我的活动中设置适配器的代码(扩展活动) 我遇到的错误是: 12661-12661/com.mobileplatformexam E/Android
问题内容: 嗨,您想创建一个自定义光标适配器,以便显示2行文本的图像。我在理解自定义光标适配器时遇到了一些麻烦,但是我不明白如何添加要从数据库路径填充的imageview。 问题答案: 将, 实际上,我已经实现了与您正在寻找的东西非常相似的东西。这是我的实现。 XML只是万一… 根据特定条件,这将在文本的两行显示最多2幅图像。 希望这可以为您的工作打下基础! 祝好运 :]
适配器目录和文件结构 适配器目录和文件结构布局的例子: /application/libraries/Driver_name Driver_name.php drivers Driver_name_subclass_1.php Driver_name_subclass_2.php Driver_name_subclass_3.php 注意: 为了在大小写敏感的文件系统上维持兼容性,这个 Drive