在SQLite中更新数据并使用它在片段中填充ListView

时间:2017-01-23 17:13:14

标签: android listview android-fragments android-asynctask fragment

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

1 个答案:

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