我正在尝试将数据从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,但它没有帮助。 如果有人知道为什么数据可能不会在片段的第一个开头显示,请帮我找到解决方案。
答案 0 :(得分: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);