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() сравнивает данные в Firebase для данных в SQLite и загрузки отсутствующих данных из Firebase в БД. Он работает бессильно, потому что я вижу его в журнале. Я также попытался добавить notifyDataSetChanged в onPostExecute, но это не помогло. Если кто-нибудь знает, почему данные могут не отображаться при первом открытии фрагмента, пожалуйста, помогите мне найти решение.

+0

Просто чтобы быть ясно, вы можете напечатать размер курсора, который возвращается в 'database.rawQuery()'. Распечатайте его и убедитесь, что размер не равен нулю в первый раз. – Dibzmania

+0

На первый размер курсора openin равен 0. Похоже, что onPostExecute запускается до завершения doInBackground. Есть ли способ сделать onPostExecute ждать завершения doInBackground? – Dmitriy

+0

То, что вы говорите, невозможно в отношении документа API Android API. Я думаю, вам нужно правильно поставить журналы и снова проверить – Dibzmania

ответ

0

notifyDataSetChanged Должен работать. Вам необходимо позвонить в нужное место.

Назовите его из нити, где вы заполняете список (в основной теме пользовательского интерфейса).

Вот пример -

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