我有以下。我有一个导航抽屉。当我单击一个项目时,主要内容框架会被另一个片段替换,具体取决于用户单击的内容。该片段然后启动一个异步任务来创建视图。我这样做是为了让应用程序不会卡住,并且用户实际上可以看到某些事情正在完成。
我现在遇到的问题是,每次我单击该项目时,片段都会再次加载。我知道这是因为我在片段的 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);
}
所以基本上有一个选项来检查一个布局是否已经被填充,如果是这样,我该怎么做,我应该把代码放在哪里?
我的方法是检查 ll 是否有孩子
if(ll.getChildCount() == 0){
new MainAsyncTask().execute();
}
但这只是在同一行给了我一个 nullPointerException