web-dev-qa-db-ja.com

android ArrayAdapterアイテムの更新

私はこのアイテム構造を持つArrayAdapterを持っています:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout ... >

         <TextView
             Android:id="@+id/itemTextView"
             ... />
</RelativeLayout>

そして、このアダプターを追加します:

mAdapter = new ArrayAdapter<String>(this, R.layout.item, 
                                            R.id.itemTextView, itemsText);

すべて順調ですが、アダプターのアイテムのテキストを更新したいです。私は解決策を見つけました

mAdapter.notifyDataSetChanged();

しかし、それを使用する方法を理解していません。助けてください。

pd私のコード:

String[] itemsText = {"123", "345", "567"};
ArrayAdapter<String> mAdapter;

onCreate

mAdapter = new ArrayAdapter<String>(this, R.layout.roomitem, 
                                              R.id.itemTextView, itemsText);
setListAdapter(mAdapter);
itemsText = {"789", "910", "1011"};

onClick

mAdapter.notifyDataSetChanged();
//it's dont work
15
Leo

こんな感じ

public void updatedData(List itemsArrayList) {

    mAdapter.clear(); 

    if (itemsArrayList != null){

        for (Object object : itemsArrayList) {

            mAdapter.insert(object, mAdapter.getCount());
        }
    }

    mAdapter.notifyDataSetChanged();

}
37
Luciano

あなたの問題は典型的なJavaポインターのエラーです。

最初のステップでは、配列を作成し、この配列をアダプターに渡します。

2番目のステップでは、新しい情報を使用して新しい配列を作成します(新しいポインターが作成されます)が、アダプターはまだ元の配列を指しています。

_// init itemsText var and pass to the adapter
String[] itemsText = {"123", "345", "567"};
mAdapter = new ArrayAdapter<String>(..., itemsText);

//ERROR HERE: itemsText variable will point to a new array instance
itemsText = {"789", "910", "1011"};
_

したがって、新しいものを作成する代わりに、配列の内容を更新するという2つのことができます。

_//This will work for your example
items[0]="123";
items[1]="345";
items[2]="567";
_

...または私がやろうとしていることは、リストを使用するようなものです:

_List<String> items= new ArrayList<String>(3);
boundedDevices.add("123");
boundedDevices.add("456");
boundedDevices.add("789");
_

そしてアップデートでは:

_boundedDevices.set("789");
boundedDevices.set("910");
boundedDevices.set("1011");
_

より多くの情報を追加するには、実際のアプリケーションでは通常、リストアダプターのコンテンツをサービスまたはコンテンツプロバイダーからの情報で更新するため、通常、アイテムを更新するには次のようにします。

_//clear the actual results
items.clear()

//add the results coming from a service
items.addAll(serviceResults);
_

これにより、古い結果をクリアし、新しい結果をロードします(新しい結果には異なる数のアイテムが必要だと考えてください)。

もちろん、データを更新した後、notifyDataSetChanged()への呼び出しを行います。

疑問がある場合は、コメントすることをheしないでください。

39
Carlos Verdes

ItemTextをString配列またはString ArrayListとして、新しいアイテムをitemsTextに追加する場合、その時点で呼び出すことができます

mAdapter.notifyDataSetChanged();

回答が得られなかった場合は、コードを入力してください。

4
Android Killer