2010-10-01 5 views
1

У меня есть ListPreference, который я динамически заполняю при нажатии на список, чтобы отобразить его. Население отлично работает, но значения, которые я заполняю, не отображаются до следующего щелчка мыши, чтобы открыть список, но вместо этого значения из xml-файла отображаются в первый раз. Похоже, что этот список уже был заполнен до вызова onPreferenceClick. Как можно обновить список? Я хочу заполнить список перед каждым щелчком в списке.Обновить ListPreference

 /** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.preferences); 

    // Get preferences. 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    screen = getPreferenceScreen(); 

    // Install on-click listener for calendars. 
    screen.findPreference("googleCalendars").setOnPreferenceClickListener(onSelectCalendarsClick); 
} 

/** 
    * We had a click on select calendars. 
    */ 
public OnPreferenceClickListener onSelectCalendarsClick = new OnPreferenceClickListener() { 
    public boolean onPreferenceClick(Preference pref) { 

    final String username; 
    final String password; 
    final String list; 

    if (pref == findPreference("googleCalendars")) { 
    username = prefs.getString("googleUsername", ""); 
    password = prefs.getString("googlePassword", ""); 
    list = "googleCalendars"; 
    } 
    else { 
    Log.d(TAG, "onSelectCalendarsClick.run(),unknown list clicked: " + pref.getTitle()); 
    return false; 
    } 

    // Show process dialog while updating. 
     final ProgressDialog dialog = ProgressDialog.show(Preferences.this, "", "Fetching calendars, please wait...", true); 
     // Show dialog, non cancelable. 
     dialog.setCancelable(false); 
     dialog.show(); 

    // Create new updater thread. 
    new Thread(){ 
    public void run() { 
    Log.d(TAG, "onSelectCalendarsClick.run(), new thread. Fetching calendars..."); 
    // Get calendars 
    // Create API. 
    CalendarApi calendarApi = new CalendarApi(prefs.getBoolean("debugFakeCalendar", false)); 
    GetCalendarsResponse response = calendarApi.GetCalendars(username, password); 
    Log.d(TAG, "onSelectCalendarsClick.run(), new thread. Done!"); 
    // Create new message and send it. 
    Message msg = new Message(); 
    Bundle bundle = new Bundle(); 
    bundle.putString("list", list); 
    msg.setData(bundle); 
    msg.obj = response; 
    getCalendarsHandler.sendMessage(msg); 
    // cancel dialog. 
    dialog.cancel(); 
    } 
    }.start(); 

    return false; 
    } 

}; 

/** 
    * Handler for processing response from getCalendars. 
    */ 
    Handler getCalendarsHandler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
     super.handleMessage(msg); 


     // We have a new message. 
     GetCalendarsResponse response = (GetCalendarsResponse)msg.obj; 
     Bundle bundle = msg.getData(); 

     // Null? 
     if (response == null || response.calendars == null) { 
      Log.d(TAG, "getCalendarsHandler.handleMessage(): response is null."); 
      return; 
     } 

     // Fetch. 
     ListPreferenceMultiSelect list = (ListPreferenceMultiSelect)screen.findPreference(bundle.getString("list")); 
     if (list != null) { 
      // Ok response. 
      list.setEntries(response.getEntries()); 
      list.setEntryValues(response.getEntryValues()); 
     } 

     // Display list preference. 
     list.getDialog().show(); 
     } 
    }; 
} 
+0

Вы когда-нибудь могли найти решение этой проблемы? У меня также есть одна и та же проблема, и мне нужен метод для создания динамического содержимого до того, как будет отключен по умолчанию onClick. В приведенном ниже решении предполагается, что контент будет динамически генерироваться при первом запуске Activity, а не во время его запуска. – jjNford

ответ

1

Документация setEntries утверждает, что параметры будут показаны в последующих диалогах.

Android заполняет ListPreference, как только OnClickPreference запускается, и все, что вы делаете после этого, будет показано в последующих диалогах.

Возможно, вам потребуется заполнить его заранее, а затем обновить его после его отображения. Лучший способ заполнить его заранее - заполнить ListPreference в onCreate и позволить ему сидеть там, чтобы отображаться.

Надеюсь, это поможет

Смежные вопросы