0

DBでサービスからデータが更新されるたびにローダーを再実行してアダプターデータを更新するにはどうすればよいですか?

DataPullService:

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

MyListFragment:

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

これで、サービスがDB内のデータを更新するたびに、ブロードキャストレシーバーがローダーを受信して​​再起動します。

注:Androidマニフェストファイルにレシーバーを登録します。

于 2012-11-28T13:32:52.650 に答える
0

1 クラスに静的リストを作成します。2 データを含むリストをロードします。3 データベースを変更するたびにリストを再読み込みします (オブザーバー パターン) 4 リストを再読み込みするたびに notifyDatasetChanged() を呼び出します (オブザーバーの update() で) 注: 無限配列アダプターを使用します

于 2012-11-28T09:06:10.477 に答える
0

データを更新する場合はgetLoaderManager().restartLoader()、ローダーを呼び出します。再度呼び出されるようrestartLoaderにトリガーされます。この場合、新しいデータがロードされます。onCreateLoader

于 2012-11-28T09:01:17.170 に答える