3

When are the items redrawn after invoking invalidateViews() ?

I ask because i try to refresh listItems after a bg-thread notify an image rsc was downloaded.

But nothing is updated. Only after exiting and re-entering the new icons are drawn.

I have an activity with adapter of type SettingValueAdapter extends BaseAdapter

it has a member:

private SettingsValue[] values;

it has two interesting methods:

            @Override
            public View getView(int position, View view, ViewGroup parent) {

                AddressItem ai= (AddressItem)getItem(position);
                DriveToNativeManager dnm = DriveToNativeManager.getInstance();


                if (view == null) {
                    LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    view = li.inflate(R.layout.address_item, null);
                }

                view.setTag(R.id.addressItem,ai);
                view.setTag(position);
                view.findViewById(R.id.fullAddressItemCol).setVisibility(View.VISIBLE);
                view.findViewById(R.id.addressItemTouch).setVisibility(View.GONE);
                view.findViewById(R.id.addressItemImage).setVisibility(View.GONE);

                if (ai != null) {
                ...
    }
                    view.findViewById(R.id.addressItemIconLayout).setVisibility(View.VISIBLE);
                    Drawable icon = ResManager.GetSkinDrawable(ai.getIcon() + ".bin");
                    ((ImageView)view.findViewById(R.id.addressItemIcon)).setImageDrawable(icon);

                  ..
                    }
}


        public void refreshListIcons()  {


    //      NativeManager nativeManager = AppService.getNativeManager();
    //      SettingsValue[] values = new SettingsValue[categories.length];
    //      for (int i = 0; i < categories.length; i++) {
    //          values[i] = new SettingsValue(categories[i].value, nativeManager.getLanguageString(categories[i].displayString), false);
    //          values[i].icon = ResManager.GetSkinDrawable(categories[i].iconName + ".bin");
    //      }
    //      adapter.setValues(values);


            this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    adapter.notifyDataSetChanged();         
                }
            });


    }   

I attach a callback to the bg-thread (c language) image downloading process.

The callback switches to the ui-thread and calls this refreshList:

public void refreshSearchIconsOnSearchActivity() {

        Runnable refreshViewEvent = new Runnable() {
            @Override
            public void run() {
                Activity currentActivity = AppService.getActiveActivity();

                if (currentActivity instanceof SearchActivity) {

                    Log.d("w", "refreshSearchIconsOnSearchActivity callback running in thread "
                                    + Thread.currentThread().getId() );
                    //results list
                    ((SearchActivity) currentActivity).refreshList();

                }
            }
        };
        AppService.Post(refreshViewEvent);
    }

However, the images are done downloading and are not refreshed on the activity.

They are refreshed only when I leave an re-enter the activity.

What am I missing?

Elad Benda
  • 30,720
  • 75
  • 234
  • 415

1 Answers1

4

InvalidateViews just causes the listView to redraw itself. It will not call getView to do so, it just resets the current ones on screen- basically it just does

for(View child: getChildren()){
    child.invalidate();
}

If you want to update the list, call notifyDataSetChanged on the adaptor.

Gabe Sechan
  • 77,740
  • 9
  • 79
  • 113