加载PreferenceFragment的ListPreference的内容时不确定ProgressBar

时间:2014-07-06 12:42:33

标签: android optimization android-fragments android-preferences

在我的PreferenceFragment中有一个ListPreference,它以编程方式填充在onCreate()上。因此,片段开始时有一点滞后。为了避免这种情况,我想仅在按下首选项时填充ListPreference,并在加载内容时放置一个不确定的ProgressBar。

我怎么能实现这个?我真的需要重写适配器吗?如何将ListPreference的视图传递给View.OnClickListener?

我希望这不是一个微不足道的问题,我已经搜索了一段时间,但我不明白我应该如何实际实现整个事情。

提前谢谢。

2 个答案:

答案 0 :(得分:6)

我为此创建了一个自定义PreferenceFragment

您可以延长此一个而不是PreferenceFragment并延迟拨打addPreferencesFromResource,直到所有加载完成后,这将隐藏ProgressBar并显示您的内容。

public class ProgressBarPreferenceFragment extends PreferenceFragment {

    private FrameLayout progress;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = super.onCreateView(inflater, container, savedInstanceState);
        showLoading((ViewGroup) view);
        return view;
    }

    @Override
    public void addPreferencesFromIntent(Intent intent) {
        super.addPreferencesFromIntent(intent);

        hideLoading();
    }

    @Override
    public void addPreferencesFromResource(int preferencesResId) {
        super.addPreferencesFromResource(preferencesResId);

        hideLoading();
    }

    private void hideLoading() {
        ViewGroup root = (ViewGroup) getView();
        if ((root != null) && (progress != null)) {
            root.removeView(progress);
        }
    }

    private void showLoading(ViewGroup root) {
        progress = new FrameLayout(root.getContext());
        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp.gravity = Gravity.CENTER;
        progress.addView(new ProgressBar(root.getContext()), lp);
        LayoutParams lp2 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        root.addView(progress, lp2);
    }
}

答案 1 :(得分:0)

您可以使用AsyncTask异步填充ListPreference,然后在完成后删除不确定的进度条。

首先,像这样扩展AsyncTask:

private class PopulateListPreferenceTask extends AsyncTask<CharSequence, Void, Void> {
 protected Long doInBackground(CharSequence... entries) {
     // Code to populate ListPreference in here
 }

 protected void onPostExecute() {
     // Add code here if necessary to retrieve the progress bar view, i.e. findViewById
     myIntederminateProgressBar.setVisibility(View.GONE);
 }

}

最初显示您的不确定进度条。然后,在您的片段onActivityCreated方法中,请致电:

new PopulateListPreferenceTask().execute(/*CharSequence entries go here*/);

一对夫妇注意到:

  • 我假设你想提供Charsequence s 输入,但您可以使用任何其他类型。
  • 如果您需要AsyncTask来接收Activity上下文,则可以 重载构造函数以将其作为参数接收然后 把它存放在一个领域。