Я расширил приложение 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;
}
}
Ну, похоже, вы знаете, о чем говорите;) Спасибо. –
Где я могу объявить BroadcastReceiver? Это внутренний класс? Я объявляю его внутри OnResume()? –
Я не могу заставить это работать. Я могу заставить onReceive срабатывать, когда я транслирую из одной и той же активности, но если я переношу трансляцию на фоновый режим синхронизации, широковещательная передача не принимается данным фрагментом. –