android ArrayAdapter项目更新

Leo*_*Leo 16 android android-arrayadapter

我有这个项目结构的ArrayAdapter:

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

         <TextView
             android:id="@+id/itemTextView"
             ... />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

并添加此适配器,以便:

mAdapter = new ArrayAdapter<String>(this, R.layout.item, 
                                            R.id.itemTextView, itemsText);
Run Code Online (Sandbox Code Playgroud)

一切都很好,但我想更新适配器项目中的文本.我找到了解决方案

mAdapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

但不明白如何使用它.请帮忙.

UPD 我的代码:

String[] itemsText = {"123", "345", "567"};
ArrayAdapter<String> mAdapter;
Run Code Online (Sandbox Code Playgroud)

的onCreate

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

的onClick

mAdapter.notifyDataSetChanged();
//it's dont work
Run Code Online (Sandbox Code Playgroud)

Car*_*des 39

您的问题是指针的典型Java错误.

在第一步中,您将创建一个数组并将此数组传递给适配器.

在第二步中,您将创建一个新数组(因此创建了新指针),其中包含新信息,但适配器仍指向原始数组.

// 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"};
Run Code Online (Sandbox Code Playgroud)

所以,你可以做两件事,一是更新数组内容而不是创建一个新内容:

//This will work for your example
items[0]="123";
items[1]="345";
items[2]="567";
Run Code Online (Sandbox Code Playgroud)

...或者我会做什么,使用List,类似于:

List<String> items= new ArrayList<String>(3);
boundedDevices.add("123");
boundedDevices.add("456");
boundedDevices.add("789");
Run Code Online (Sandbox Code Playgroud)

并在更新中:

boundedDevices.set("789");
boundedDevices.set("910");
boundedDevices.set("1011");
Run Code Online (Sandbox Code Playgroud)

要添加更多信息,通常在实际应用程序中使用来自服务或内容提供商的信息更新列表适配器的内容,因此通常更新项目,您将执行以下操作:

//clear the actual results
items.clear()

//add the results coming from a service
items.addAll(serviceResults);
Run Code Online (Sandbox Code Playgroud)

有了这个,您将清除旧结果并加载新结果(认为新结果应该具有不同数量的项目).

并且当然更新数据后调用notifyDataSetChanged();

如果您有任何疑问,请不要犹豫,发表评论.

  • 请举个例子. (2认同)

Luc*_*ano 38

我觉得这样的事情

public void updatedData(List itemsArrayList) {

    mAdapter.clear(); 

    if (itemsArrayList != null){

        for (Object object : itemsArrayList) {

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

    mAdapter.notifyDataSetChanged();

}
Run Code Online (Sandbox Code Playgroud)

  • 您不需要向适配器添加项目,只需在完成arraylist的工作后调用notifyDataSetChanged (5认同)

And*_*ler 5

假设 itemTexts 为 String 数组或 String ArrayList,在那里您将新项目添加到 itemsText 之后,您可以调用

mAdapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)

如果您没有得到答案,请输入一些代码。