2016-11-29 2 views
2

Я расширил приложение AbstractThreadedSyncAdapter и получил его для автоматической синхронизации данных с моим сервером каждые x минут или когда я вручную запрашиваю синхронизацию через код. Он работает отлично.Как обновить Android ListView после SyncAdapter завершает синхронизацию

Итак, следующий шаг автоматически обновляет сообщения, содержащие ListView, а другой - назначенные задания.

Образцы, которые я нашел, предполагают, что вы меняете свой набор данных из одной и той же деятельности или у вас есть доступ к курсору базы данных, к которому привязан ListView. К сожалению, для Android Sync Adapter это не так. Он работает в фоновом режиме и не имеет никакого отношения ни к чему полезному, насколько я могу судить.

Мой 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

// ЧТО БЫ ОДИН ДЕЛАТЬ ЗДЕСЬ ПРЕДУПРЕЖДАЕТ ListView, ЧТО ОНА ReFRESH?

Отправить местного вещания так:

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

Пусть Fragment с ListView объявить BroadcastReceiver:

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 например в 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.

Другой вариант - это использование определенного типа автобусов событий (greenrobot, Otto ...).

+0

Ну, похоже, вы знаете, о чем говорите;) Спасибо. –

+0

Где я могу объявить BroadcastReceiver? Это внутренний класс? Я объявляю его внутри OnResume()? –

+0

Я не могу заставить это работать. Я могу заставить onReceive срабатывать, когда я транслирую из одной и той же активности, но если я переношу трансляцию на фоновый режим синхронизации, широковещательная передача не принимается данным фрагментом. –