0

Я новичок в Android (это мое первое приложение), и я сделал GridView в Activity, который я бы хотел, чтобы он был отзывчивым в зависимости от положения экрана (портрет/пейзаж). Конечно, я сделал некоторые пользовательские значения макета GridView ширины строк как для портрета, так и для пейзажа, и он отлично работает. За исключением того, что при каждом изменении ориентации экрана снова загружается GridView. И это плохо для пользователей. Мне нравится только GridView (и, безусловно, его строки), чтобы настроить на новую ширину экрана, не выполняя все инструкции onCreate() (получение GridView данных из Интернета, назначение устаревших данных в объекте HashMap, установка GridViewAdapter, а затем отображение GridView). Я прошел через многие темы форума и некоторую документацию Google, в которой говорится о восстановлении простых значений, но так и не нашел ответа на восстановление GridView без повторной перезагрузки. Я читал около onSaveInstanceState() и onRestoreInstanceState(), но я не знал, как их использовать в моем случае (GridView case).Восстановить Android GridView после изменения ориентации экрана (без перезагрузки)

Может ли кто-нибудь предоставить простой пример кода для этого? Или, по крайней мере, некоторые заголовки?

Вот некоторые из того, что я пытался в моем коде, в Activity классе:

private Parcelable mListInstanceState; 
    private Parcelable mAdapterInstanceState; 

    private GridView gridView = null; 
    private MyAdapter myAdapter = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     gridView = (GridView) findViewById(R.id.gridview); 

     // Check whether we're recreating a previously destroyed instance 
     if(savedInstanceState != null) { 
      // Restore value of members from saved state 
      mListInstanceState = savedInstanceState.getParcelable("gridview"); 
      mAdapterInstanceState = savedInstanceState.getParcelable("adapter"); 
     } 
     else { 
      // Retrieve data from internet, fill HashMap object, 
      // set Adapter and display GridView only for the first time the activity is created 
      attemptToDisplayGirdViewItems(); 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle state) { 
     // Save activity state 

     super.onSaveInstanceState(state); 

     state.putParcelable("gridview", gridView.onSaveInstanceState()); 
     // state.putParcelable("adapter", myAdapter);    
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     // Retrieve and restore activity state 

     // Restore state members from saved instance 
     mListInstanceState = savedInstanceState.getParcelable("gridview"); 
     mAdapterInstanceState = savedInstanceState.getParcelable("adapter"); 

     super.onRestoreInstanceState(savedInstanceState); 
    } 
+1

вам лучше сохранить данные (из интернета) только ... FX с использованием либо устаревший 'Activity.getLastNonConfigurationInstance()' или с UI-менее сохран фрагмент ... все остальное должно быть там ... GridView сохраняет позицию текущего элемента в 'onSaveInstanceState', поэтому вам следует беспокоиться об этом ... – Selvin

+1

http://selvin.pl/MainActivity.java.txt проверьте класс CacheFragment и его использование ... данные, полученные из Интернета, хранятся в 'JSONArray CacheFragment.response', и он« выживает »при изменении настроек экрана ... loadData запускает новый запрос или немедленно возвращает данные, зависит от того, будет ли' response' это s et уже или нет – Selvin

+0

Спасибо @Selvin за вашу помощь. Я попробовал решение Eugen, и он отлично сработал :) – AndroWeed

ответ

2

Вам не нужно, чтобы сохранить точку. Если они имеют идентификатор, они будут автоматически сохранены (например, положение прокрутки GridView). Что нужно сохранить, так это набор данных адаптера.

Ваш адаптер, предположительно, содержит список элементов. Если эти элементы не являются примитивами или String или не реализуют Serializable, для этого необходимо реализовать Parcelable.

Смотрите здесь, как сделать это: How can I make my custom objects Parcelable?

Ваш адаптер нужен getItems метод, который возвращает набор данных - в ArrayList ваших parcelable пунктов. Он также должен иметь метод setItems(...) или конструктор, содержащий список элементов в качестве параметра.

Тогда ваша деятельность будет выглядеть следующим образом:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    gridView = (GridView) findViewById(R.id.gridview); 

    myAdapter = new MyAdapter(); // Create empty adapter. 
    if(savedInstanceState != null) { 
     ArrayList<MyItem> items = savedInstanceState.getParcelableArrayList("myAdapter"); 
     myAdapter.setItems(items); // Load saved data if any. 
    } 
    gridView.setAdapter(myAdapter); 
} 

@Override 
protected void onSaveInstanceState(Bundle state) { 
    super.onSaveInstanceState(state); 
    state.putParcelableArrayList("myAdapter", myAdapter.getItems()); 
} 
+0

Дорогой друг Евгений Печанец, я не могу поблагодарить вас за вашу любезную и щедрую помощь ... он работал как шарм! Вы спасли не только мой день, но и мою жизнь. Огромное спасибо!! И я так рад тебя знать :) – AndroWeed

+1

@ MouradJEMAÏL Ты только что сделал свой день: D Рад, что я мог бы помочь. Теперь я рекомендую сосредоточиться на загрузке элементов из Интернета эффективно. Вы можете посмотреть этот https://www.youtube.com/watch?v=BlkJzgjzL0c (хотя это может быть немного тяжелым делом). Поскольку у вас есть новый экземпляр активности для каждого изменения конфигурации, вы не можете полагаться на простую задачу async, привязанную к ее первоначальной активности. Удачи! –

+0

Спасибо, мой друг :) Действительно, видео звучит очень интересно. Я открыт для любого ресурса, который может оптимизировать мою практику в разработке Android, и, безусловно, поможет мне узнать больше :) – AndroWeed

Смежные вопросы