首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >刷新ListPreference

刷新ListPreference
EN

Stack Overflow用户
提问于 2010-10-01 20:26:39
回答 2查看 2.8K关注 0票数 1

我有一个ListPreference,当单击列表以显示它时,我会动态填充它。填充工作正常,但是我填充的值直到下一次单击打开列表时才会显示,而是第一次显示来自xml文件的值。感觉在调用onPreferenceClick之前,列表已经被填充了。我该如何刷新列表呢?我希望在每次单击列表之前填充列表。

代码语言:javascript
复制
     /** 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(); 
      }
    };
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-02 06:54:12

setEntries的文档指出,这些设置将显示在后续对话框中。

一旦OnClickPreference被触发,Android就会填充ListPreference,之后你所做的任何事情都会在随后的对话框中显示出来。

您可能希望预先填充它,然后在显示后刷新它。预先填充它的最好方法是在onCreate中填充ListPreference,并让它在那里显示。

希望这能有所帮助

票数 1
EN

Stack Overflow用户

发布于 2020-02-22 01:01:45

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

这个问题的解决方案是,您需要创建一个本地列表首选项类。

代码语言:javascript
复制
public class YourClassListPreference extends android.preference.ListPreference

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

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

您还需要在使用ListPreference的所有声明、类型转换和xml文件中将其更新为YourClassListPreference。我还在xml文件中发现,您需要使用完整路径(不仅是YourClassListPreference,还包括com.android.settings.YourClassListPreference或其他构建设置)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3839114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档