0

をListViewコントロールを移入私はSQLiteのにFirebaseからデータをロードし、その後の断片でそれを表示しようとしているが、データは断片のみの第二の開口部の上に表示されます。 doInBackground関数myClass.myFunctionで更新データとそれにフラグメントに

public class Root_Exercises_Fragment_v2 extends BaseFragment { 
    public static final String TAG = "TAG1"; 
    private ListView mListview; 
    private MyAdapter mAdapter; 
    private DBHelper dbHelper; 
    private SQLiteDatabase database; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.myLayout, container, false); 
     new AsyncClass().execute(); 
     mListview = (ListView) view.findViewById(R.id.mListview); 
     return view; 

    } 

    class AsyncClass extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected Void doInBackground(Void... parameter) { 
      MyClass myClass = new MyClass(getActivity()); 
      myClass.myFunction(); 
      return null; 
     } 


     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      Log.v("TAG", "In postExecute"); 
      dbHelper = new DBHelper(getActivity()); 
      database = dbHelper.getReadableDatabase(); 
      mAdapter = new MyAdapter(getActivity(), database.rawQuery(getString(R.string.myQuery), null)) { 
      }; 
      mListview.setAdapter(mAdapter); 
     } 
    } 
} 

()は、SQLiteのデータとDBするFirebaseから欠落データダウンロードにFirebaseのデータを比較します。それは、私がログで見ることができるので、致命的に機能します。 また、notifyDataSetChangedをonPostExecuteに追加しようとしましたが、それは役に立たなかったです。 フラグメントの最初のオープン時にデータが表示されない理由が分かっている場合は、解決策を見つけるのを助けてください。

+0

だけ明確にすることは、 'database.rawQuery()'で返されているカーソルのサイズを印刷することができます。それを印刷し、初めてサイズがゼロでないことを確認してください。 – Dibzmania

+0

最初のopeninカーソルサイズは0です。これは、doInBackgroundの前にonPostExecute startが終了したようです。 onPostExecuteをdoInBackgroundが完了するまで待機させる方法はありますか? – Dmitriy

+0

Android APIのドキュメントによると、あなたの言うことは不可能です。私はあなたがログを適切に入れて、再度チェックする必要があると思う – Dibzmania

答えて

0

が動作するはずnotifyDataSetChanged。 あなたは適切な場所でそれを呼び出す必要があります。

は、あなたが(メインUIスレッドで)リストを埋めるスレッドからからそれを呼び出します。ここで

は例です -

results = ... 
if(mHandler==null) 
    mHandler = new Handler(Looper.getMainLooper()); 
Runnable myRunnable = new Runnable() { 
     @Override 
     public void run() { 
       mResultList.addAll(results); 
       mResultListAdapter.notifyDataSetChanged(); 
     } 
}; 
mHandler.post(myRunnable); 
関連する問題