2016-11-29 7 views
2

AbstractThreadedSyncAdapterを拡張して、x分ごとにサーバーと自動的にデータを同期させるようにしました。それは完全に動作します。SyncAdapterが同期を完了した後にAndroid ListViewをリフレッシュする方法

これで、メッセージを含むListViewと割り当てられたジョブを含むリストビューが自動的に更新されます。

私が見つけたサンプルはすべて、同じアクティビティ内からデータセットを変更しているか、そうでなければListViewがバインドされているデータベースカーソルにアクセスしていることを前提としています。残念ながら、Android Syncアダプタの場合はそうではありません。それはバックグラウンドで実行され、私が知る限り有用なものへの言及はありません。

マイSyncAdapter:

public class VttSyncAdapter extends AbstractThreadedSyncAdapter { 
    private final AccountManager mAccountManager; 

    public VttSyncAdapter(Context context, boolean autoInitialize) { 
     super(context, autoInitialize); 
     mAccountManager = AccountManager.get(context); 
    } 

    @Override 
    public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { 
     Log.d("Vtt", "onPerformSync for account[" + account.name + "]"); 
     try 
     {   
      //GET SOME DATA FROM WEBSERVICE AND INSERT INTO SQLITE DB 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     //WHAT WOULD ONE DO HERE TO ALERT THE LISTVIEW THAT IT SHOULD REFRESH? 

     } catch (Exception e) { 
      e.printStackTrace(); 

    } 

    public String getsharedresourcestring(String key) 
    { 
     Context context = getContext(); 
     SharedPreferences sharedPref = context.getSharedPreferences(context.getString(R.string.preference_file_key), MODE_PRIVATE); 
     return sharedPref.getString(key,null); 
    } 

} 

マイスケジュールフラグメントコード:

public class ScheduleFragment extends Fragment { 
    private ListView listView; 
    private List<DeliveryScheduleEntryModel> schedules; 


    public ScheduleFragment() { 
     // Required empty public constructor 
    } 

    public static ScheduleFragment newInstance(String param1, String param2) { 
     ScheduleFragment fragment = new ScheduleFragment(); 
     Bundle args = new Bundle(); 
     //args.putString(ARG_PARAM1, param1); 
     //args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      //mParam1 = getArguments().getString(ARG_PARAM1); 
      //mParam2 = getArguments().getString(ARG_PARAM2); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View ret = inflater.inflate(R.layout.fragment_schedule, container, false); 

     listView = (ListView) ret.findViewById(R.id.listViewSchedule); 

     //GET OUR DATA 
     Activity activity = this.getActivity(); 
     ContentResolver contentResolver = activity.getContentResolver(); 
     schedules = getSchedule(contentResolver); 

     DeliveryScheduleEntryModelList customList = new DeliveryScheduleEntryModelList(activity, schedules); 

     listView.setAdapter(customList); 
     return ret; 
    } 

    public List<DeliveryScheduleEntryModel> getSchedule(ContentResolver cr) 
    { 
     Context context = getContext(); 
     VttDataSource db = new VttDataSource(context); 
     db.open(); 
     List<DeliveryScheduleEntryModel> ret = db.getAllDeliveryScheduleEntryModel(); 
     db.close(); 

     return ret; 
    } 
} 

答えて

3

// ONEは、ITがリフレッシュする必要がありLISTVIEWに警告するためにここで何をしますか?

このようローカル放送を送信:

private BroadcastReceiver myReceiver = new BroadcastReceiver() 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 

     String sAction = intent.getAction(); 
     if ("com.your_package.name.REFRESH_LIST".equals(sAction)) 
     { 
      // update the ListView here 
     } 
    } 
} 

BroadcastReceiver例えば登録:

Intent intent = new Intent(); 
intent.setAction("com.your_package.name.REFRESH_LIST"); 
LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 

ListViewFragmentBroadcastReceiverを宣言してみましょうin onAttach()

IntentFilter myFilter = new IntentFilter(); 
myFilter.addAction("com.your_package.name.REFRESH_LIST"); 
LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver, myFilter); 

また、登録を解除することを忘れないでください。 onDetach()

LocalBroadcastManager.getInstance(this).unregisterReceiver(myReceiver); 

この方法で、Fragmentは限りそれはActivityに接続されているとして更新メッセージを取得します。

もう1つのオプションは、イベントバス(greenrobot、Otto ...)を使用しています。

+0

あなたが話していることを知っているように聞こえます;)ありがとう。 –

+0

BroadcastReceiverはどこで宣言しますか?それは内部クラスですか? OnResume()内に宣言しますか? –

+0

私はこれを動作させることはできません。私は同じアクティビティからブロードキャストするときにonReceiveを起動できますが、ブロードキャストをバックグラウンド同期アクティビティに移動すると、問題のフラグメントでブロードキャストが受信されません。 –

関連する問題