2013-10-16 67 views
0

我有以下幾點。我有一個導航抽屜。當我點擊一個項目時,主內容框架會被另一個片段替換,這取決於用戶點擊的內容。片段然後啓動一個asynctask來創建視圖。我這樣做,所以應用程序不會卡住,用戶可以實際看到有些事情正在完成。僅加載片段視圖一次

現在我遇到的問題是,每次我點擊該項目片段時都會重新加載。我知道這是因爲我在片段的onCreate方法中調用了AsyncTask,但是有沒有解決如何在已經加載一次時不再加載整個事件?

長話短說:

我有一個被填充數據的片段。我不希望用戶認爲該應用程序被卡住,因此我添加了一個進度條和一個異步任務,以便用戶可以看到某些事情正在完成。

問題再次應用程序加載的一切,當我點擊一個項目 解決方案我想,當一旦它被保存,不會再被稱爲片段被加載。

這是我的代碼。我縮小了它,所以你不需要讀太多。只需用線儘可能少的

MAINFRAGMENT

@Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     new MainAsyncTask().execute(); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState){ 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     StrictMode.setThreadPolicy(policy); 
     View rootView = inflater.inflate(R.layout.main_fragment, container, false); 
     rl = (RelativeLayout) rootView.findViewById(R.id.mainRelativeLayout); 
     sv = (ScrollView) rootView.findViewById(R.id.mainScrollView); 
     ll = (LinearLayout) rootView.findViewById(R.id.mainListView); 
     progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar1); 
     return rootView; 
    } 

的AsyncTask

private class MainAsyncTask extends AsyncTask<Void, Void, Void> { 

     TextView[] source; 
@Override 
     protected void onPreExecute() { 
//   super.onPreExecute(); 
      progress = 0; 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      source  = new TextView[todayHashMapSize]; 
for (int i = 0; i < todayHashMapSize; i++) { 

       source[i]  = new TextView(getActivity()); 
} 
return null 
} 

protected void publishProgress(int value) { 
       progressBar.setProgress(value); 
     } 

     @Override 
     protected void onPostExecute(Void result){ 
      for (int i = 0; i < todayHashMapSize; i++) { 
       ll.addView(source[i]); 


      } 
      ll.removeView(progressBar); 

     } 

所以基本上是有來檢查是否佈局已經已填充一個選項,如果是的話怎麼辦我這樣做,我在哪裏放置代碼?

我的方法是檢查LL是否有孩子的用

if(ll.getChildCount() == 0){ 
     new MainAsyncTask().execute(); 
    } 

但只是給了我一個NullPointerException異常在相同的一行

回答

0

使用無頭片段與調用

setRetainInstance(true); 

以防止其被破壞。

看到這些鏈接,瞭解更多信息:http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html#fragmentsandbackgroundprocessing

http://creeder.com/?&page=AsyncTask

+0

您好,感謝這一點。我google了一下,發現它應該放在onCreateView方法裏面..但是這並沒有改變任何東西.. 我究竟在哪裏放置它?我有onCreate,onViewCreated和onCreateView。 或者我必須將它設置在某個地方,然後詢問它是否屬實? http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean) 該文檔並沒有真正幫助那裏。 – Musterknabe

+0

我給出的鏈接中的示例顯示OnCreate()中的調用 – Kuffs

+0

是的,這正是我所做的 MainAsyncTask mainAsyncTask; \t @Override \t公共無效的onCreate(捆綁savedInstanceState){ \t \t super.onCreate(savedInstanceState); \t \t setRetainInstance(true); \t \t \t \t如果(mainAsyncTask!= NULL){ \t \t \t新MainAsyncTask()執行()。 \t \t} \t} 但它也沒有工作。儘管感謝您的幫助。爲了您的努力,會給你一個滿意的答覆。 :) – Musterknabe

相關問題