1

質問/問題をより明確にするために、これをもう一度投稿します。

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アイテムを設定し、アダプターを作成してこれにアイテムを追加し、それをListViewlvに表示します。ここまでは順調ですね。

ただし、getShoppingList()メソッドは数回実行され、ArrayListアイテムが更新されます。そして、これが発生するたびにアダプターを再作成するのではなく、アダプターを更新して、更新されたコンテンツをListViewlvに表示したいと思います。

私が試しているのはこれです:

「更新」ボタンの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を備えたListViewlvがあります。

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

-新しいアイテムがtmpitemsArrayListに読み込まれます。-新しいアイテムの数が0より大きい場合、ローカルファイルはtmpitemsで更新されます。-次に、アイテムArrayListがローカルファイルから更新されます(新しいエントリを追加するgetShoppingList()メソッドを使用)-次に、上記のように、アダプターを更新することになっているrefreshList()メソッドを実行してみます。

アイテムArrayListが更新され、ローカルファイルが更新されます。それは私が働かせることができないアダプターのただの更新方法です。アダプタを初期化すると、アイテムはListViewに表示されます。アダプタを更新すると、新しいコンテンツは表示されません。

4

1 に答える 1

2

((ItemArrayAdapter)lv.getAdapter()).notifyDataSetChanged()の代わりに使用adapter.notifyDataSetChanged()

更新: アダプターnotifyDataSetChanged()のデータが変更された場合にのみ機能し、リストを再レンダリングします。あなたの場合、データを外部で変更するので、アダプターのデータを変更する必要があります。

アダプターの交換方法と方法nlist.add(...)が必要にinsert()なります:公式リファレンスremove()

それがどのように機能するかについてのいくつかの説明:アダプタを初期化するとき、それはあなたがそれに渡したitems配列をそれ自身のものに貼り付けるだけです。アイテム配列に加えられた変更は認識されなくなりました。

于 2012-09-14T20:58:13.887 に答える