Метод 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);
    }
    ...
}
Другие вопросы по тегам