5

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

どんな洞察も大歓迎です!

ありがとうございました。

4

5 に答える 5

13

追加するだけ

notifyDataSetChanged()

** アダプター内で、アプリがリストをリロードします。

^^

于 2016-04-01T10:44:15.733 に答える
0

私の問題を見てくれたみんなに感謝します。このソリューションが他の人に役立つことを願っています。

リストのさまざまなセクションのアダプターを管理する、分離されたリストのアダプターを使用していました。私が問題を抱えていたアダプターは、マネージド アダプターの 1 つでした。

私がしたことは、SeekBar がスクロールされたときの状況を処理するコールバック関数 (Java で) を作成することでした。アダプターに登録したので、呼び出されると、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();
    }
}

ありがとう :)

于 2012-11-19T20:26:59.670 に答える
0

notifyDataSetChanged()次の方法で呼び出す必要があります。

ArrayAdapter<String> adapter; // where adapter - your adapter
adapter = new ArrayAdapter<String>(...);
adapter.notifyDataSetChanged();
于 2012-11-18T12:13:03.590 に答える