0

每当从服务更新数据库中的数据时,如何重新运行加载程序以更新适配器数据?

数据拉取服务:

public class DataPullService extends Service {


    private Timer nstimer=new Timer();

    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        NetworkConnection network=new NetworkConnection(this.getApplicationContext());
        boolean online = network.isOnline();
        if(online){
            try {
                nstimer.scheduleAtFixedRate(new TimerTask() {
                    public void run() {
                        DBHelper dbHelper=new DBHelper(getApplicationContext());
                        SQLiteDatabase mydb = dbHelper.getWritableDatabase();

                        ContentValues values=new ContentValues();
                        values.put(DBConstants.COMPANY, "Innodea");

                        mydb.insert(DBConstants.FAVORITE_TABLE, null, values);

                    }
                }, 0, 60000);
            } catch (Exception e) {
          }
        }
        return startId;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        nstimer.cancel();
    }
}

我的列表片段:

public class MyListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {


    private SimpleCursorAdapter mAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        setEmptyText("List loading...");
        setHasOptionsMenu(true);

        mAdapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_2, null, new String[]{DBConstants.SNO,DBConstants.COMPANY}, new int[]{android.R.id.text1,android.R.id.text2});

        setListAdapter(mAdapter);

        getLoaderManager().initLoader(0, null, this);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
        DBHelper dbHelper=new DBHelper(getActivity());
        return new LiveMyLoader(getActivity(),dbHelper);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> arg0, Cursor c) {
        mAdapter.swapCursor(c);
        setListAdapter(mAdapter);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> arg0) {
        mAdapter.swapCursor(null);
    }


}

上面的代码在创建片段时加载数据。那么当DB中的数据发生变化时如何更新这个列表片段(由DataPullService更新)?

4

3 回答 3

1

我在 MyListFragment 中添加了一个 BroadcastReceiver,并在 onReceive 方法中重新启动了 Loader。

在 MyListFragment-onActivityCreated 中:

mycontext=this;
getActivity().registerReceiver(FragmentReceiver1, new IntentFilter("fragmentupdater"));

在 MyListFragment 中

private final BroadcastReceiver FragmentReceiver1 = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            getLoaderManager().restartLoader(0, null, mycontext);
            Log.i("timer", "Broadcast received");
        }};

在 MyListFragment-onDestroyView 中:

@Override
    public void onDestroyView() {
        super.onDestroyView();
        getActivity().unregisterReceiver(FragmentReceiver1);


}

在 DataPullService 中:

Intent intent=new Intent("fragmentupdater");
sendBroadcast(intent);

现在每当服务更新数据库中的数据时,广播接收器就会收到并重新启动加载程序。

注意:在 Android 清单文件中注册接收器。

于 2012-11-28T13:32:52.650 回答
0

当你想刷新数据时,调用getLoaderManager().restartLoader()你的加载器。restartLoader将触发onCreateLoader再次调用。在这种情况下,它将加载新数据。

于 2012-11-28T09:01:17.170 回答
0

1 在类中创建静态列表。2 加载数据列表。3 每次更改数据库时重新加载列表(观察者模式) 4 每次重新加载列表时调用 notifyDatasetChanged() (在观察者的 update() 中)注意:使用无限数组适配器

于 2012-11-28T09:06:10.477 回答