1

在我的PreferenceFragment中有一個ListPreference,它在onCreate()上以編程方式填充。因此,在片段開始處有一點滯後。爲了避免它,我希望只在首選項被按下時填充ListPreference,並且在加載內容時放置一個不確定的ProgressBar。加載PreferenceFragment的ListPreference的內容時不確定ProgressBar

我該如何實現?我真的需要重寫適配器嗎?我如何獲得ListPreference的視圖傳遞給View.OnClickListener?

我希望這不是一個微不足道的問題,我已經搜索了一段時間,但我不明白我應該如何實際執行整個事情。

預先感謝您。

+0

我現在正面臨類似的情況。你能找到解決你的問題嗎? – Phat7

回答

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接收活動上下文,您可以將構造函數重載爲將其作爲參數接收,然後 將其存儲在字段中。
+0

非常感謝您的回覆。我不明白如何使最初顯示的不確定進度欄。其次,我找不到任何有關activityCreateView方法的文檔。 – turlando

+0

編輯我的回覆(意思onActivityCreated而不是activityCreateView)。您是以編程方式或在佈局XML中創建進度欄嗎? – EricaCooksey

+0

我習慣於在XML中定義UI元素。我想創建一個新的RelativeLayout並將其綁定到ListPreference對話框的內容佔位符。這樣對嗎? – turlando

4

我爲此創建了一個自定義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); 
    } 
}