刷新数据库更改的listfragment

时间:2015-04-24 08:25:04

标签: android android-fragments android-listview android-sqlite

所以我有这个listfragment显示来自localdatabase的数据。 localdatabase来自远程服务器。所以这个过程非常像

  1. 从服务器获取数据并插入数据库。
  2. 从数据库中获取数据并设置为适配器。
  3. 显示数据。

    public void onFragmentViewCreated(ListFragment fragment, Activity activity){
       mDialog = new ProgressDialog(this);
       mDialog.setMessage("Loading Feed");
       mDialog.setCancelable(false);
    
       mReminderList = new ArrayList<Reminder>();
       final ListFragment mFragment = fragment;
       final Activity mActivity = activity;
    
       mHelper = new ReminderHelper(this);
       new AsyncTask<Void, Void, List<Reminder>>(){
        @Override
        protected void onPreExecute(){
            // getting data from server
            mHelper.fetchFeed();
            // show dialog
            showDialog();
        }
        @Override
        protected List<Reminder> doInBackground(Void... params){
            // getting data from database
            mReminderList = mHelper.getFeed();
            return mReminderList;
        }
        @Override
        protected void onPostExecute(List<Reminder> reminders){
            mFeedAdapter = new FeedAdapter(mActivity, reminders);
            mFeedAdapter.notifyDataSetChanged();
            mFragment.setListAdapter(mFeedAdapter);
            // hide dialog and show the data
            hideDialog();
        }
       }.execute();
    }
    
  4. 我的代码有效。但问题是,在重新启动活动之前,listfragment没有显示数据。 (并没有出现进度对话框)。我想要实现的是listfragment在数据库更新后立即显示数据(在从服务器获取数据时使用进度对话框)。提前谢谢..

2 个答案:

答案 0 :(得分:0)

尝试交换这两行

    mFeedAdapter.notifyDataSetChanged();
    mFragment.setListAdapter(mFeedAdapter);

当适配器设置为ListView时,视图会附加一个Observer,用于侦听适配器中的更改。调用notifydatasetchanged方法会通知所有附加的观察者。在您的情况下,您没有附加观察者,因为您在将适配器设置为ListView之前调用该方法。

答案 1 :(得分:0)

使用CursorLoader从本地数据库中获取最新的结果。或者,在数据库上附加observer以检查其更新事件并相应地更新列表。