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();
}