当前位置: 首页 > 知识库问答 >
问题:

数组适配器,列表视图,创建和更新内容

江佐
2023-03-14

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

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中会显示项目——更新时,新内容不会显示。

共有1个答案

欧阳永宁
2023-03-14

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