0

我試圖從Firebase加載數據到SQLite,然後在片段中顯示它,但數據僅在片段的第二次打開時顯示。在SQLite中更新數據並在它的片段中填充ListView

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

在doInBackground函數myClass.myFunction()在火力地堡在SQLite的數據和下載缺失從火力地堡數據到DB數據進行比較。它有效地工作,因爲我可以在日誌中看到它。 我也嘗試將notifyDataSetChanged添加到onPostExecute,但它沒有幫助。 如果有人知道爲什麼數據可能不會在第一次打開片段時顯示,請幫助我找到解決方案。

+0

只是要清楚,你可以打印在'database.rawQuery返回光標()'的大小。打印並確保首次大小不爲零。 – Dibzmania

+0

第一個openin光標大小爲0.看起來,onPostExecute在doInBackground完成之前開始。有沒有辦法讓onPostExecute等待doInBackground完成? – Dmitriy

+0

根據Android API doc,你所說的是不可能的。我認爲你需要正確放置日誌並再次檢查 – 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);