2012-11-17 50 views
3

我有一個適配器(擴展BaseAdapter),我試圖調用notifyDataSetChanged(),但它不工作。我相信notifyDataSetChanged()實際上是在調用Eclipse調試器的基礎上調用的。但是,它不會調用getView()。我的適配器的底層數據正在改變,因爲它應該。我在適配器中有一個方法updateSettings(),用於更新適配器底層的數據。如果我從我的ListViewActivity調用updateSettings(),我沒有任何問題... notifyDataSetChanged()的行爲與我所期望的一樣。但是,當我從適配器內調用updateSettings()時,notifyDataSetChanged()不起作用。我是否嘗試從適配器內調用notifyDataSetChanged(),從根本上做錯了什麼?下面是一些代碼,我有:從適配器內調用notifyDataSetChanged失敗

public View getView(int position, View convertView, ViewGroup parent) 
{ 
    Log.d(CLASS_NAME, "Entered getView()"); 
    View row = convertView; 
    _settingViewHolder = new PhoneSettingViewHolder(); 
    final int index = position; 

    /* If this is the first time the list is being built, get all of the UI widgets 
    * and store them in a PhoneSettingViewHolder object for future use on 
    * subsequent writing of the list. 
    */ 
    if(row == null) 
    { 
     LayoutInflater inflater = (LayoutInflater)_context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = inflater.inflate(R.layout.phone_list_complex, null, false); 

     _settingViewHolder.txtSettingName = (TextView)row.findViewById(R.id.phone_list_complex_title); 
     _settingViewHolder.txtSettingValue = (TextView)row.findViewById(R.id.phone_list_complex_caption); 
     _settingViewHolder.sbTimeout = (SeekBar)row.findViewById(R.id.slider); 
     _settingViewHolder.txtPercent = (TextView)row.findViewById(R.id.percent); 

     _settingViewHolder.sbTimeout.setMax(30); 
     _settingViewHolder.sbTimeout.setProgress(1); 

     // associate this PhoneSettingViewHolder object with the row 
     row.setTag(_settingViewHolder); 
    } 
    else 
    { 
     // get the PhoneSettingViewHolder object that is associated with this row 
     _settingViewHolder = (PhoneSettingViewHolder)row.getTag(); 
    } 

    // get Setting object and store values in PhoneSettingViewHolder object 
    final Setting setting = _settings.get(position); 
    _settingViewHolder.txtSettingName.setText(setting.getSettingName()); 
    Log.d(CLASS_NAME, "setting.getSettingValue() = " + setting.getSettingValue()); 
    _settingViewHolder.txtSettingValue.setText(setting.getSettingValue()); 

    /* Event handlers for SeekBar */ 
    _settingViewHolder.sbTimeout.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean isUser) 
     { 
      Log.d(CLASS_NAME, "Entered onProgressChanged()"); 
      String percent = String.valueOf(progress); 
      updateSettings(index, percent); 
     } 

     public void onStartTrackingTouch(SeekBar seekBar) 
     { 
      // Nothing to do here 
     } 

     public void onStopTrackingTouch(SeekBar seekBar) 
     { 
      // Nothing to do here 
     } 
    }); 


    return row; 

} 

在該塊中,我設置的行觀點和附加的事件處理程序的搜索欄。我想要發生的是,當某人滾動SeekBar時,它會更新上面的文本。這裏是我的updateSettings()方法:

public void updateSettings(int index, String progress) 
    { 
     Log.d(CLASS_NAME, "Entered updateSettings()"); 
     Setting setting = new Setting(SETTING_NAME, progress); 
     _settings.set(index, setting); 
     Log.d(CLASS_NAME, "Calling notifyDataSetChanged()"); 
     notifyDataSetChanged(); 
     Log.d(CLASS_NAME, "Returned from notifyDataSetChanged()"); 
    } 

任何洞察力是讚賞!

謝謝。

回答

0

必須以這種方式撥打notifyDataSetChanged()

ArrayAdapter<String> adapter; // where adapter - your adapter 
adapter = new ArrayAdapter<String>(...); 
adapter.notifyDataSetChanged(); 
+0

謝謝。這幫助我爲我的問題制定解決方案,因爲我知道我必須從適配器外部調用。 – user1791622

0

謝謝大家誰看了我的問題。我希望這個解決方案可以幫助別人。

我正在使用適配器作爲分隔列表,它管理着列表不同部分的適配器。我遇到問題的適配器是受管適配器之一。

我所做的是製作一個回調函數(Java),它處理SeekBar滾動時的情況。我跟我的適配器註冊,所以當它被調用時,它調用adapter.notifyDataSetChanged:

public void eventNotifier(InterestingEvent event) 
{ 
    _event = event; // register event handler 
} 

class NotifyDataSetChangedEvent implements InterestingEvent { 

    private final String CLASS_NAME = "NotifyDataSetChangedEvent"; 

    public void interestingEventHappened() 
    { 
     Log.d(CLASS_NAME, "Entered interestingEventHappened()"); 
     _adapter.notifyDataSetChanged(); 
    } 
} 

謝謝:)

3

同樣的問題我有,解決的辦法是: 不要叫NotifyDataSetChanged()裏面的適配器 叫它使用listView.getAdapter().notiftDataSetChanged()

它會工作。

+0

你可以解釋你把那行「listView.getAdapter()。notiftDataSetChanged()」放在哪裏?謝謝 – Terranology

7

只需添加

notifyDataSetChanged()

**適配器內部和app'll刷新列表。

^^

0

我只是添加

notifyDataSetChanged() 

內的onClick在onBindViewHolder(),它的工作對我來說〜

相關問題