0

私は次のものを持っています。ナビゲーションドロワーがあります。1 つのアイテムをクリックすると、ユーザーがクリックした内容に応じて、メイン コンテンツ フレームが別のフラグメントに置き換えられます。次に、フラグメントは asynctask を開始してビューを作成します。これを行うのは、アプリが動かなくなり、ユーザーが何かが行われていることを実際に確認できるようにするためです。

私が今直面している問題は、アイテムをクリックするたびにフラグメントが再度ロードされることです。これは、フラグメントの onCreate メソッドで AsyncTask を呼び出しているためであることはわかっていますが、一度読み込まれたときに全体を再度読み込まないようにする方法はありますか?

簡単に言えば:

データで満たされたフラグメントがあります。アプリが停止しているとユーザーに思わせたくないので、進行状況バーと非同期タスクを追加して、ユーザーが何かが完了したことを確認できるようにしました。

1 つの項目をクリックすると、アプリがすべてを再びロードする 問題ソリューションフラグメントがロードされたときに、フラグメントが保存され、再度呼び出されないようにする必要があります。

これが私のコードです。あまり読む必要がないように縮小しました。可能な限り少ない行を使用しただけです

メインフラグメント

@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 を与えるだけです

4

1 に答える 1