我有一个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();
}
};
}
答案 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或您的构建已设置)。