仅加载片段视图一次

时间:2013-10-16 14:11:06

标签: java android layout android-fragments android-asynctask

我有以下内容。我有一个导航抽屉。当我点击一个项目时,主内容框架将被另一个片段替换,这取决于用户点击的内容。然后片段启动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

1 个答案:

答案 0 :(得分:0)

使用无头片段并调用

setRetainInstance(true);

防止它被摧毁。

有关详情,请参阅以下链接:http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html#fragmentsandbackgroundprocessing

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