我有一个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();
}
};
}发布于 2011-03-02 06:54:12
setEntries的文档指出,这些设置将显示在后续对话框中。
一旦OnClickPreference被触发,Android就会填充ListPreference,之后你所做的任何事情都会在随后的对话框中显示出来。
您可能希望预先填充它,然后在显示后刷新它。预先填充它的最好方法是在onCreate中填充ListPreference,并让它在那里显示。
希望这能有所帮助
发布于 2020-02-22 01:01:45
我意识到这个问题已经有10年的历史了,但我也遇到了同样的问题,而且还没有答案,我估计将来会有更多的人遇到这个问题。此外,/u/radhashankark是正确的,问题是在调用setEntries时onPreferenceClick函数已经填充了ListPreference,所以您所做的任何更改都不会反映在列表中。
这个问题的解决方案是,您需要创建一个本地列表首选项类。
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或其他构建设置)。
https://stackoverflow.com/questions/3839114
复制相似问题