刷新ListPreference

时间:2010-10-01 12:26:39

标签: android

我有一个ListPreference,我在点击列表时动态填充它以显示它。 人口工作正常,但我填充的值直到下次单击打开列表时才显示,而是第一次显示xml文件中的值。感觉就像在调用onPreferenceClick之前已经填充了列表。我怎样才能刷新列表呢?我想在列表中的每次点击之前填充列表。

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

2 个答案:

答案 0 :(得分:1)

setEntries的文档说明设置将显示在后续对话框中。

Android会在触发OnClickPreference时立即填充ListPreference,之后执行的任何操作都将显示在后续对话框中。

您可能希望事先填充它,而不是在显示后刷新它。预先填充它的最佳方法是在onCreate中填充ListPreference,让它坐在那里显示。

希望这有帮助

答案 1 :(得分:0)

我意识到这个问题大约有10年的历史了,但是我遇到了同样的问题,目前还没有答案,而且我认为将来会有更多的人遇到这个问题。另外,/ u / radhashankark是正确的,问题在于onPreferenceClick函数已经在调用setEntries时填充了ListPreference,因此您所做的任何更改都不会反映在列表中。

解决方案是您需要创建本地列表首选项类。

public class YourClassListPreference extends android.preference.ListPreference

然后填写所有关联的构造函数,getOnDialogClickListener(不确定是否需要),setOnDialogClickListener(不确定是否需要),getOnPreferenceClickListener,setOnPreferenceClickListener,最重要的是onClick。

现在,对于重要部分,在onClick函数中,首先调用mOnPreferenceClickListener.onPreferenceClick(this),然后调用super.onClick()。这样,您就可以在“被调用”之前填充ListPreference。

您还需要在所有使用此方法的声明,演员表和xml文件中将ListPreference更新为YourClassListPreference。我还在xml文件中找到了,您需要使用完整路径(不仅是YourClassListPreference,而且还需要使用com.android.settings.YourClassListPreference或您的构建已设置)。