【发布时间】:2017-01-23 17:13:13
【问题描述】:
我正在尝试将数据从 Firebase 加载到 SQLite,然后在片段中显示,但数据仅在片段的第二次打开时显示。
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 下载到 db。它绝对有效,因为我可以在日志中看到它。 我也尝试将 notifyDataSetChanged 添加到 onPostExecute,但没有帮助。 如果有人知道为什么在第一次打开片段时可能无法显示数据,请帮我找到解决方案。
【问题讨论】:
-
为了清楚起见,您能否打印
database.rawQuery()中返回的光标大小。打印它并确保第一次大小不为零。 -
第一次打开时光标大小为 0。似乎 onPostExecute 在 doInBackground 完成之前开始。有什么办法让 onPostExecute 等待 doInBackground 完成?
-
根据 Android API 文档,您所说的是不可能的。我认为您需要正确放置日志并再次检查
标签: android listview android-fragments android-asynctask fragment