Android列表首选项视图刷新

Android列表首选项视图刷新,android,android-listfragment,Android,Android Listfragment,我遇到了一个问题,在运行一些代码后,我想更新我应用程序设置片段中当前显示的listPreference 以下是我正在尝试的步骤: 将向用户显示设置视图 有一个列表首选项。当他点击时: 2a默认条目/值显示在xml文件中,并且是可见的 2b一些代码在后台运行,并将新值写入listPreference列表preference视图/对话框仍然可见。 2c现在我想更新此视图以显示新条目 在上面2b处,这是我正在做的: listPreference = findPreference("mp_key");

我遇到了一个问题,在运行一些代码后,我想更新我应用程序设置片段中当前显示的listPreference

以下是我正在尝试的步骤:

将向用户显示设置视图 有一个列表首选项。当他点击时: 2a默认条目/值显示在xml文件中,并且是可见的 2b一些代码在后台运行,并将新值写入listPreference列表preference视图/对话框仍然可见。 2c现在我想更新此视图以显示新条目 在上面2b处,这是我正在做的:

 listPreference = findPreference("mp_key");
 listPreference.setEntries(cs);
 listPreference.setEntryValues(cs);
 //Call on Resume method of the Fragment
下面是发生的情况。 2a默认条目/值显示在xml文件中,并且是可见的 2b运行一些代码并将新值写入listPreference。列表首选项视图/对话框仍然可见。 3用户选择项目或取消项目,列表视图消失并显示摘要 4当用户再次单击listPreference时,将显示新条目

//代码如下

public class SettingsActivity extends AppCompatActivity {
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit();
    }
}

public class SettingsFragment extends PreferenceFragmentCompat {
    private static ListPreference listPreference;
    @Override
    public void onCreatePreferences(Bundle bundle, String s) {
        setPreferencesFromResource(R.xml.preferences, s);
        listPreference = findPreference("mp_key"); //in xml resource, not provided here
        listPreference.setOnPreferenceClickListener(listPrefClickListener);
        }


Preference.OnPreferenceClickListener channelClickListener = new Preference.OnPreferenceClickListener() {
        @Override
        public boolean onPreferenceClick(Preference preference) {
            CharSequence[] cs = listToCharSequence; //test purposes 
            listPreference.setEntries(cs);
            listPreference.setEntryValues(cs);
            return false;
        }
    };
}

我不确定您所说的在后台运行某些代码并将新值写入listPreference列表preference视图/对话框是什么意思,但添加了一个设置片段代码,其中包含一个复选框和一个列表。希望这能指引你实现目标

public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener{

/**
 * creating the preferences
 * @param savedInstanceState saved instance state
 * @param rootKey some key
 */
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    addPreferencesFromResource(R.xml.gl_preferences);

    SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
    PreferenceScreen prefScreen = getPreferenceScreen();

    int count = prefScreen.getPreferenceCount();

    for(int i = 0; i < count; i++){
        Preference p = prefScreen.getPreference(i);
        if(!(p instanceof CheckBoxPreference)){
            String value = sharedPreferences.getString(p.getKey(), "");
            setPreferenceSummary(p, value);
        }
    }
}

/**
 * setting up the summary of the list preference
 * @param preference that needs to have the summary set
 * @param value summary
 */
private void setPreferenceSummary(Preference preference, String value){
    if(preference instanceof ListPreference){
        ListPreference listPreference = (ListPreference)preference;
        int prefIndex = listPreference.findIndexOfValue(value);
        if(prefIndex >= 0){
            listPreference.setSummary(listPreference.getEntries()[prefIndex]);
        }
    }
}

/**
 * Listener when the preferences change
 * @param sharedPreferences that changed
 * @param key that changed
 */
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference preference = findPreference(key);
    if(null != preference) {
        if(!(preference instanceof CheckBoxPreference)){
            String value = sharedPreferences.getString(preference.getKey(), "");
            setPreferenceSummary(preference, value);
        }
    }
}

/**
 * Shared preference created
 * @param savedInstanceState
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

/**
 * cleaning up
 */
@Override
public void onDestroyView() {
    super.onDestroyView();
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}

}

我还没有弄清楚原因,但我想我没有连接到列表视图小部件来刷新它。我已经决定放弃这一点,继续采取不同的策略

感谢Tibor的投入。这就是我现在所做的:

以异步方式运行我的后台任务 任务完成时更新共享引用 显示首选项屏幕
我想通过重新绘制列表对话框来更新列表中显示的条目,因为我不希望用户离开listView屏幕。有可能吗?当SharedPref发生更改时,您正在更新摘要。