【问题标题】:ArrayAdapter, ListView, creating and updating contentsArrayAdapter、ListView、创建和更新内容
【发布时间】:2012-09-07 15:55:46
【问题描述】:

我再次发布这个,试图让问题/问题更清楚:

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.");
        }

但是,用于更新适配器的行(在更新项目之后)完全没有任何作用。我知道项目已更新,因为它也已写入文件,所以问题不存在。此外,如果我将更新适配器的行替换为重新创建适配器的行,则效果很好。

更新(2012 年 9 月 16 日):

private void getShoppingList () {
    items = ls.getShoppingList(SHOPPINGLIST_FILE, cdate);
}

ls.getShoppingList() 方法:

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

---------- 原帖------

我有一个带有 ArrayAdapter 的 ListView lv,用于显示项目行。

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 ArrayList。 - 如果新项目的数量 > 0,则使用 tmpitems 更新本地文件。 - 然后从本地文件更新项目 ArrayList(使用 getShoppingList() 方法,该方法添加 新条目) - 然后我尝试运行 refreshList() 方法,该方法应该更新适配器,如上所述。

项 ArrayList 更新,本地文件更新。这只是我无法工作的适配器上的更新方法。初始化适配器时,项目显示在 ListView 中 - 更新时,新内容不显示。

【问题讨论】:

  • 如何更新项目?你能发布一些代码吗?
  • 试试 lv.getAdapter().notifyDataSetChanged();
  • 该行给了我这个错误:“方法 notifyDataSetChanged() 未定义为 ListAdapter 类型”

标签: android arraylist android-listview android-arrayadapter


【解决方案1】:

使用((ItemArrayAdapter)lv.getAdapter()).notifyDataSetChanged() 而不是adapter.notifyDataSetChanged()

更新: 问题是 notifyDataSetChanged() 仅在适配器内部的数据发生变化时才起作用,并且它会重新呈现列表。在您的情况下,您在外部更改数据,因此您必须更改适配器内部的数据。

您需要将nlist.add(...) 替换为适配器的insert()remove() 方法:official reference

对其工作原理的一些说明:当您初始化适配器时,它只是将您传递给它的 items 数组粘贴到它自己的数组中。它不再知道对您的 items 数组所做的更改。

【讨论】:

  • 这不起作用 - 它给出以下错误:“方法 notifyDataSetChanged() 未定义 ListAdapter 类型”
  • 谢谢,但还是不行。在我重新启动应用程序并重新创建适配器之前,ListView 仍然是空的。
  • 然后向我们展示您更新适配器中数据的代码。
  • 在上面的 public void onClick (View v) 方法中。我刚刚替换了“adapter.notifyDataSetChanged();”这一行与 "((ItemArrayAdapter)lv.getAdapter()).notifyDataSetChanged()";
  • 我的意思是这些方法:getShoppingList(); updateLatestItem();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
相关资源
最近更新 更多