0

我在用着public class SettingValueAdapter extends BaseAdapter

它有一个数组private SettingsValue[] values;,因为它是数据集。

当活动可见时,我更改数据(也称为动态)

我使用notifyDataSetChanged但用户界面没有改变。

我已经看到了一个我应该使用ArrayList并实际删除和重新输入元素的答案。

但是我有一个数组,我只能重新分配它或重新分配其中的元素。

我无法更改为 ArrayList,因为这是一个常见的共享代码,它会太痛苦。

这真的是问题吗?这就是为什么我的 UI 不会动态变化的原因?

在我的活动中:

public void refreshListIcons() {

        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                if (categories != null) {

                    SettingsValue[] values = adapter.getValues();
                    for (int i = 0; i < values.length; i++) {
                        values[i].icon = ResManager
                                .GetSkinDrawable(categories[i].iconName + ".bin");
                    }

                    adapter.setValues(values);

                    adapter.notifyDataSetChanged();

                    //mListView.invalidateViews();
                    //mListView.refreshDrawableState();

                }

            }
        });


}
4

1 回答 1

0

这一行:

  SettingsValue[] values = adapter.getValues();

不是真正复制数组,它只是指适配器数组。这是适配器在设置自身时不会触发更改的原因。尝试复制一个像这样的数组:

  SettingsValue[] values = Arrays.copyOf(adapter.getValues(),adapter.getValues().length);

然后通知更改应该起作用。

更新
来自文件

通知附加的观察者底层数据已更改,任何反映数据集的视图都应自行刷新。

notifyDataSetChanged仅当您使用适配器上的添加、插入、删除和清除功能时才有效。在这种情况下,您替换了适配器中的数据集,因此它可能会触发更改。

更新 2:我已经测试了上面的代码和JafarKhQ方法,它们都运行良好。所以,如果你的图标没有更新,我认为你的适配器中的设置图像方法有问题。尝试通过资源名称或资源 ID(在适配器的 getView 方法中)为图像视图设置图像,如下所示:

 // Set image by string name, make sure string name don't have extension, for example: "icon1"
 ImageView img = (ImageView)convertView.findViewById(R.id.imageView1);
// find the id of resource image
 int id = context.getResources().getIdentifier("yourpackage:drawable/" + arr[position].getImage(), null, null);
 img.setImageResource(id);

这是JafarKhQ推荐的,它应该有效:

       for (int i = 0; i < adapter.getValues().length; i++) {
       adapter.getValues()[i].icon = ResManager
                            .GetSkinDrawable(categories[i].iconName + ".bin");
       }

       // don't need set data set for adapter, just notify change.
       adapter.notifyDataSetChanged();
于 2013-06-30T15:41:34.740 回答