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);
}
}