notifyDataSetChanged() を呼び出そうとしているアダプター (BaseAdapter を拡張) がありますが、機能していません。Eclipseデバッガーを使用してステップインすることに基づいて、notifyDataSetChanged()が実際に呼び出されていると思います。ただし、getView() は呼び出しません。アダプターの基礎となるデータが変更されています。アダプターの基礎となるデータを更新するメソッド updateSettings() がアダプターにあります。ListViewActivity から updateSettings() を呼び出すと、何の問題もありません...notifyDataSetChanged() は期待どおりに動作します。しかし、アダプター内から updateSettings() を呼び出すと、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 にアタッチします。私が望んでいるのは、誰かが 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()" );
}
どんな洞察も大歓迎です!
ありがとうございました。