2013-06-27 52 views
3

什麼時候在調用invalidateViews()後重新繪製項目?當調用`invalidateViews()`後重繪項目時

我問,因爲我嘗試刷新listItems後bg線程通知圖像rsc被下載。

但沒有更新。只有在退出並重新輸入新圖標後纔會繪製。

我有一個活動類型的adapterSettingValueAdapter extends BaseAdapter

它有一個成員:

private SettingsValue[] values;

它有兩個有趣的方法:

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


    } 

我附上一個回調到bg-thread(c語言)圖像下載過程。

回調切換到UI線程,並調用這個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); 
    } 

然而,圖像完成下載,而​​不是更新的活動。

只有當我離開重新進入活動時才刷新它們。

我錯過了什麼?

+1

這是一個「C」問題? –

+1

bg線程在c中。我以爲這可能是一個線索 –

+0

檢查下面的線程http://stackoverflow.com/questions/4903758/android-how-to-refresh-listview-contents – neo

回答

4

InvalidateViews只會導致listView重繪自己。它不會調用getView這樣做,它只是重置在絲網當前那些基本上它只是做

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

如果要更新列表,請撥打notifyDataSetChanged適配器上。

+0

我也試過這個(參見我的''refreshList()'方法)。但沒有任何反應 –

+0

你正在更新保存getItem(位置)使用的數據的任何數組嗎? –

+0

另外,你的ResManager.GetSkinDrawable更新下載後返回的值,還是可能卡住返回一些默認值(或null)? –

相關問題