簡體   English   中英

只能加載片段視圖一次

[英]Load fragment view only once

我有以下幾點。 我有一個導航抽屜。 當我單擊一項時,取決於用戶單擊的內容,主要內容框架將替換為另一片段。 然后,該片段啟動asynctask來創建視圖。 我這樣做是為了使應用程序不會卡住,用戶實際上可以看到已經完成了某些事情。

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

長話短說:

我有一個充滿數據的片段。 我不希望用戶認為應用程序卡住了,所以我添加了進度欄和異步任務,以便用戶可以看到正在完成某件事。

問題是,當我單擊一項時,應用程序會再次加載所有內容。 解決方案我希望在片段被保存后立即加載而不再次調用。

這是我的代碼。 我將其縮小,因此您不需要閱讀太多。 只需使用最少的行

主片段

@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;
    }

異步任務

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);

        }

因此,基本上有一個選項可以檢查是否已經填充了布局,如果可以的話,該怎么做?將代碼放在哪里?

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

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

但這只是在完全相同的行上提供了一個nullPointerException

使用無頭片段調用

setRetainInstance(true);

防止它被破壞。

有關更多信息,請參見以下鏈接: http : //www.vogella.com/articles/AndroidBackgroundProcessing/article.html#fragmentsandbackgroundprocessing

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM