Метод onloadfinished для Android Loadermanager не вызывался при изменении ориентации, когда он был объявлен снаружи при создании метода
Я инициализирую загрузчик в методе обратного вызова элемента списка навигации панели действий. По умолчанию первый элемент будет выбран в списке навигации на панели действий. на основе выбора navitem я инициализирую загрузчик. при запуске приложения методы обратного вызова загрузчика вызывают нормально. но когда я меняю ориентацию, методы обратного вызова загрузчика не вызываются. но если я инициализирую загрузчик в методе oncreate, методы обратного вызова загрузчика также вызываются после изменения ориентации.
Мой код:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
getActionBar().setListNavigationCallbacks(adapter, new ActionBar.OnNavigationListener() {
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
if(itemPosition == 0 || itemPosition ==1)
{
Bundle b = new Bundle();
b.putString(Constatnts.Url, serviceurl +"/getgroups/"+shared.getString("StationID", "null")+"/0");
b.putInt(Constatnts.selection, itemPosition);
b.putString(Constatnts.xmlroles, session.getUserDetails().get(SessionManager.KEY_NAME).get(1));
getLoaderManager().initLoader(0, b, MainActivity.this);
}
else if(itemPosition == 2)
{
Bundle b = new Bundle();
b.putString(Constatnts.Url, serviceurl +"/getchanneldetails/"+shared.getString("StationID", "null")+"/1/0");
b.putInt(Constatnts.selection, itemPosition);
b.putString(Constatnts.xmlroles, session.getUserDetails().get(SessionManager.KEY_NAME).get(1));
getLoaderManager().initLoader(itemPosition, b, MainActivity.this);
}
else
{
Bundle b = new Bundle();
b.putString(Constatnts.Url, serviceurl+"/Getcategories/"+shared.getString("StationID", "null")+"");
b.putInt(Constatnts.selection, itemPosition);
b.putString(Constatnts.xmlroles, session.getUserDetails().get(SessionManager.KEY_NAME).get(1));
getLoaderManager().initLoader(itemPosition, b, MainActivity.this);
}
return true;
}
});
}
Методы обратного вызова загрузчика не вызываются после изменения ориентации вышеуказанным методом.
*но если я размещу приведенный ниже код за пределами навигационных списков navigation list и внутри метода oncreate, методы обратного вызова загрузчика будут вызваны *
Bundle b = new Bundle();
b.putString(Constatnts.Url, serviceurl +"/getgroups/"+shared.getString("StationID", "null")+"/0");
b.putInt(Constatnts.selection, itemPosition);
b.putString(Constatnts.xmlroles, session.getUserDetails().get(SessionManager.KEY_NAME).get(1));
getLoaderManager().initLoader(0, b, MainActivity.this);
Как я могу перезагрузить данные после изменения ориентации, если initloader находится в методах setListNavigationCallbacks.
1 ответ
Обратные вызовы вызываются только после запуска загрузчика (initLoader
) или перезапущен (restartLoader
). С initLoader
кэшированный результат может быть использован после изменения ориентации, но он должен вызываться явно для доставки данных в onLoadFinished
, Следовательно, вы должны назвать это в своем onCreate
метод с itemPosition
в качестве идентификатора загрузчика, но только если itemPosition
уже установлено.
Я вырезал ваш пример кода, чтобы проиллюстрировать, что я имею в виду:
// static so that it survives orientation change.
private static int mSelectedItemPosition = -1; // -1 = Not selected
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mSelectedItemPosition != -1) {
getLoaderManager().initLoader(mSelectedItemPosition, null, MainActivity.this);
}
getActionBar().setListNavigationCallbacks(adapter, new ActionBar.OnNavigationListener() {
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
if(itemPosition == 0 || itemPosition ==1) {
mSelectedItemPosition = 0;
Bundle b = ...
getLoaderManager().initLoader(mSelectedItemPosition, b, MainActivity.this);
}
else if(itemPosition == 2) {
mSelectedItemPosition = itemPosition;
Bundle b = ...
getLoaderManager().initLoader(mSelectedItemPosition, b, MainActivity.this);
}
else {
mSelectedItemPosition = itemPosition;
Bundle b = ...
getLoaderManager().initLoader(mSelectedItemPosition, b, MainActivity.this);
}
...
}