Java 只加载片段视图一次

Java 只加载片段视图一次,java,android,layout,android-fragments,android-asynctask,Java,Android,Layout,Android Fragments,Android Asynctask,我有以下几点。我有一个导航抽屉。当我单击一个项目时,主内容框架将被另一个片段替换,具体取决于用户单击的内容。然后,片段启动一个异步任务来创建视图。我这样做是为了让应用程序不会被卡住,用户可以看到一些事情正在完成 我现在遇到的问题是,每次单击该项时,片段都会再次加载。我知道这是因为我在片段的onCreate方法中调用了我的AsyncTask,但是在已经加载一次的情况下,有没有解决方法来避免再次加载整个内容 长话短说: 我有一个片段,里面充满了数据。我不想让用户认为应用程序被卡住了,所以我添加了一个

我有以下几点。我有一个导航抽屉。当我单击一个项目时,主内容框架将被另一个片段替换,具体取决于用户单击的内容。然后,片段启动一个异步任务来创建视图。我这样做是为了让应用程序不会被卡住,用户可以看到一些事情正在完成

我现在遇到的问题是,每次单击该项时,片段都会再次加载。我知道这是因为我在片段的onCreate方法中调用了我的AsyncTask,但是在已经加载一次的情况下,有没有解决方法来避免再次加载整个内容

长话短说:

我有一个片段,里面充满了数据。我不想让用户认为应用程序被卡住了,所以我添加了一个进度条和一个异步任务,这样用户就可以看到已经完成了一些事情

问题当我点击一个项目时,应用程序会再次加载所有内容 解决方案我希望在片段保存后加载,并且不再调用

这是我的密码。我把它缩小了,这样你就不需要读太多了。只是用了尽可能少的线

main片段

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

        }

但这只是在同一行上给了我一个nullPointerException

使用无头片段调用

setRetainInstance(true);
防止它被破坏

有关更多信息,请参见以下链接:


你好,谢谢你。我在谷歌上搜索了一下,发现它应该放在onCreateView方法中。。但这并没有改变任何事情。。我到底要把它放在哪里?我有onCreate、onViewCreated和onCreateView。或者我必须把它放在某个地方,然后问它是不是真的?文档在这方面没有真正的帮助。是的,这正是我所做的MainAsyncTask MainAsyncTask;@Override public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setRetainInstance(true);if(mainAsyncTask!=null){new mainAsyncTask().execute();}}但它也不起作用。谢谢你的帮助。将对您的努力投赞成票。:)你不能仅仅从教程中挑选几行代码,然后认为它会起作用。跟随他们,理解他们,然后将这些知识应用到你的情况中。
setRetainInstance(true);