PropertyDetailPagerAdapter, как правильно обрабатывать изменения ориентации?

У меня есть пара фрагментов и пейджер. Пользователь, конечно, может перемещаться между страницами в пейджере просмотра. Моя проблема в том, что когда пользователь меняет ориентацию, текущая страница теряет все свои данные!, НО, когда пользователь перемещается назад и вперед, данные извлекаются снова, и страница заполняется правильными данными.

Я проверил предложения в этом и этом посте. Никто не работал.

Вот мой код:

public class PropertyDetailActivity extends AppCompatActivity {
    Toolbar toolbar;
    long[] mPropertiesIDs;
    private ViewPager mPager;
    private PagerAdapter mPagerAdapter;

    @Override
    public void onSaveInstanceState(final Bundle outState) {
        super.onSaveInstanceState(outState);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        long ID = getIntent().getExtras().getLong("ID");
        mPropertiesIDs = getIntent().getExtras().getLongArray("propertiesIDs");
        setContentView(R.layout.activity_property_detail);
        setupToolbar();
        mPager = (ViewPager) findViewById(R.id.pager);
        mPagerAdapter = new PropertyDetailPagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);
        int index = PropertyArrayList.getIndexOf(mPropertiesIDs, ID);
        mPager.setCurrentItem(index);
    }

    private void setupToolbar() {
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        final ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);// will make the icon clickable and add the < at the left of the icon.
//        actionBar.setHomeButtonEnabled(true); will just make the icon clickable, with the color at the background of the icon as a feedback of the click.
//        actionBar.setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_property_detail, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }


//**********************************************************************************************************************

    private class PropertyDetailPagerAdapter extends FragmentStatePagerAdapter {
        public PropertyDetailPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            mPropertiesIDs = getIntent().getExtras().getLongArray("propertiesIDs");
            PropertyDetailFragment fragment = new PropertyDetailFragment();
            fragment.setPropertyID(mPropertiesIDs[position]);
            return fragment;
        }

        @Override
        public int getCount() {
            return mPropertiesIDs.length;
        }

(Я не уверен, смогу ли я выразить себя достаточно хорошо, так как я плохо говорю по-английски. Поэтому не стесняйтесь редактировать или оставлять комментарии:))

Заранее благодарны за Вашу помощь.

2 ответа

Используйте это свойство в теге активности вашего манифеста, и он не потеряет данные.

        android:configChanges="orientation|screenSize"

У меня есть это в одном из моих приложений (примеры онлайн-курса). Я не могу это объяснить, но я надеюсь, что это поможет вам!

Комментарии в коде, связанные с темой

private int mPosition = ListView.INVALID_POSITION;
private static final String SELECTED_KEY = "selected_position";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    [...]

    mPosition = position;

    [...]

    // If there's instance state, mine it for useful information.
    // The end-goal here is that the user never knows that turning their device sideways
    // does crazy lifecycle related things.  It should feel like some stuff stretched out,
    // or magically appeared to take advantage of room, but data or place in the app was never
    // actually *lost*.
    if (savedInstanceState != null && savedInstanceState.containsKey(SELECTED_KEY)) {
        // The listview probably hasn't even been populated yet.  Actually perform the
        // swapout in onLoadFinished.
        mPosition = savedInstanceState.getInt(SELECTED_KEY);
    }

[...]

}

@Override
public void onSaveInstanceState(Bundle outState) {
    // When tablets rotate, the currently selected list item needs to be saved.
    // When no item is selected, mPosition will be set to Listview.INVALID_POSITION,
    // so check for that before storing.
    if (mPosition != ListView.INVALID_POSITION) {
        outState.putInt(SELECTED_KEY, mPosition);
    }
    super.onSaveInstanceState(outState);
}


@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    mForecastAdapter.swapCursor(data);
    if (mPosition != ListView.INVALID_POSITION) {
        // If we don't need to restart the loader, and there's a desired position to restore
        // to, do so now.
        mListView.smoothScrollToPosition(mPosition);
    }
}
Другие вопросы по тегам