【问题标题】:Update data in SQLite and populate ListView in fragment with it更新 SQLite 中的数据并用它在片段中填充 ListView
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多