我有一個適配器(擴展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()");
}
任何洞察力是讚賞!
謝謝。
謝謝。這幫助我爲我的問題制定解決方案,因爲我知道我必須從適配器外部調用。 – user1791622