2016-11-24 4 views
1

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

код, который я использую:

@Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     View view = inflater.inflate(R.layout.fragments_stops_list, container, false); 
     ButterKnife.bind(this, view); // since this is a fragment the butterknife bind method should goafter the view declaration 
     // saved state would indicate that we are now not capable of making multiple requests. This point has been 
     // properly taken care of and now I can purposely move on to other things of more importance 
     loadButton = (Button) view.findViewById(R.id.LOAD); 
     if(savedInstanceState == null) { 
      loadButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Log.d(">==========<", extractCreate.getCreateR().getPhone()); 
        Parcelable[] parcelable = extractCreate.getStopsR(); 
        commodities = Arrays.copyOf(parcelable, parcelable.length, Stops[].class); 
        //Log.d("Commodities size check", String.valueOf(commodities.length)); 


        StopsAdapter adapter = new StopsAdapter(commodities); 
        mRecyclerView.setAdapter(adapter); 
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); // sketchy on this part 
        mRecyclerView.setLayoutManager(layoutManager); 
        mRecyclerView.setHasFixedSize(true); 
        Log.d(TAG, "This is being called from the onCreate method"); 


       } 
      }); 
     } 



     return view; 
    } 

Дело в том, если я пытаюсь повернуть экран затем содержимое исчезает и сделать их один раз должен нажать кнопку (из id.LOAD) , Я добавил заявление, чтобы проверить, является ли состояние saveInstance нулевым, это решение не работает, как сейчас, когда я поворачиваю экран cardviews, который я загружаю через адаптер, исчезает, и нет возможности загрузить их снова.

Могу ли я сохранить состояние? Я читал об переопределении метода onViewStateRestored, но идея не кажется многообещающей, поскольку содержимое необходимо обрабатывать внутри прослушивателя кликов.

Любые предложения будут очень благодарны.

В соответствии с запросом, это код.

public class Stops implements Parcelable{ 
    private String stop_id; 
    private String type; 
    private String location; 
    private String address; 
    private String city; 
    private String state; 
    private String zip; 
    private String from; 
    private String to; 

    private String getitem; 

    private Commodities[] commodities; 



    public Stops() {} 
    public String getStop_id() { 
     return stop_id; 
    } 

    public void setStop_id(String stop_id) { 
     this.stop_id = stop_id; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 


    public String getLocation() { 
     return location; 
    } 

    public void setLocation(String location) { 
     this.location = location; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 

    public String getCity() { 
     return city; 
    } 

    public void setCity(String city) { 
     this.city = city; 
    } 

    public String getState() { 
     return state; 
    } 

    public void setState(String state) { 
     this.state = state; 
    } 

    public String getZip() { 
     return zip; 
    } 

    public void setZip(String zip) { 
     this.zip = zip; 
    } 

    public String getFrom() { 
     return from; 
    } 

    public void setFrom(String from) { 
     this.from = from; 
    } 

    public String getTo() { 
     return to; 
    } 

    public void setTo(String to) { 
     this.to = to; 
    } 

    public Commodities[] getCommodities() { 
     return commodities; 
    } 



    public void setCommodities(Commodities[] commodities) { 
     this.commodities = commodities; 
    } 
    /** 
    * The content for the actual parcelables start in here 
    * 
    * */ 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(this.stop_id); 
     dest.writeString(this.type); 
     dest.writeString(this.location); 
     dest.writeString(this.address); 
     dest.writeString(this.city); 
     dest.writeString(this.state); 
     dest.writeString(this.zip); 
     dest.writeString(this.from); 
     dest.writeString(this.to); 
     dest.writeString(this.getitem); 
     dest.writeTypedArray(this.commodities, flags); 
    } 

    protected Stops(Parcel in) { 
     this.stop_id = in.readString(); 
     this.type = in.readString(); 
     this.location = in.readString(); 
     this.address = in.readString(); 
     this.city = in.readString(); 
     this.state = in.readString(); 
     this.zip = in.readString(); 
     this.from = in.readString(); 
     this.to = in.readString(); 
     this.getitem = in.readString(); 
     this.commodities = in.createTypedArray(Commodities.CREATOR); 
    } 

    public static final Parcelable.Creator<Stops> CREATOR = new Parcelable.Creator<Stops>() { 
     @Override 
     public Stops createFromParcel(Parcel source) { 
      return new Stops(source); 
     } 

     @Override 
     public Stops[] newArray(int size) { 
      return new Stops[size]; 
     } 
    }; 
} 
+0

Здесь есть несколько вопросов относительно этой проблемы. Например, проверьте этот http: // stackoverflow.com/questions/13305861/fool-proof-way-to-handle-fragment-on-orientation-change –

+0

@TodorKostov hi Todor и спасибо за указатель, к сожалению, параметры, описанные в этой статье, уже были применены раньше (установка setRetainInstance как true, так и оператор if в состоянии saveInstance, как описано в моем коде), и все же метод не будет работать. –

+0

Но вы пытались переопределить метод ** onSavedInstanceState() ** и сохранить необходимую информацию? Я не вижу его в вашем исходном коде. –

ответ

3

В связи с тем, что ваш фрагмент уничтожалась и созданный снова, когда ориентация изменяется, вы должны выполнить определенную логику, чтобы сохранить данные, собранные им до события изменения ориентации.

Это делается путем переопределения onSavedInstanceState (Bundle bundle). Все, что вам нужно сохранить, включено здесь. Вы помещаете свои данные в объект Bundle и назначаете ему ключ, чтобы иметь возможность получить его в последнее время.

Когда ОС снова воссоздает ваш фрагмент, он снова пройдет через метод onCreateView(). Это место, где вы должны проверить, не является ли объект savedInstanceState NULL. Если это не так, то, скорее всего, содержит некоторые данные, которые были сохранены до того, как произошло событие изменения ориентации.

Ознакомьтесь с нижеследующим строком.

public class SomeClass extends Activity { 

    private static final String KEY = "some_key"; 

    commodities; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     View view = inflater.inflate(R.layout.fragments_stops_list, container, false); 
     ButterKnife.bind(this, view); // since this is a fragment the butterknife bind method should goafter the view declaration 
     // saved state would indicate that we are now not capable of making multiple requests. This point has been 
     // properly taken care of and now I can purposely move on to other things of more importance 
     loadButton = (Button) view.findViewById(R.id.LOAD); 
     if(savedInstanceState == null) { 
      loadButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Log.d(">==========<", extractCreate.getCreateR().getPhone()); 
        Parcelable[] parcelable = extractCreate.getStopsR(); 
        commodities = Arrays.copyOf(parcelable, parcelable.length, Stops[].class); 
        //Log.d("Commodities size check", String.valueOf(commodities.length)); 


        StopsAdapter adapter = new StopsAdapter(commodities); 
        mRecyclerView.setAdapter(adapter); 
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); // sketchy on this part 
        mRecyclerView.setLayoutManager(layoutManager); 
        mRecyclerView.setHasFixedSize(true); 
        Log.d(TAG, "This is being called from the onCreate method"); 


       } 
      }); 
     } else { 
      if(savedInstanceState.containsKey(KEY)) { 
      commodities = savedInstanceState.getParcelable(KEY); 
      // here you will pretty much repete the code from above 
      // for creating an Adapter for the RecyclerView 
        StopsAdapter adapter = new StopsAdapter(commodities); 
        mRecyclerView.setAdapter(adapter); 
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); // sketchy on this part 
        mRecyclerView.setLayoutManager(layoutManager); 
        mRecyclerView.setHasFixedSize(true); 
      } 
     } 
     return view; 
    } 

     @Override 
     public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putParcelable(KEY, commodities); 
     } 

} 

Для правильного сохранения данных ваш класс товаров необходимо реализовать Parcelable. Проверьте эту ссылку для получения дополнительной информации. Parcelable

P.S. Из-за того, что я не знаю фактического типа объекта товаров yout, вам придется немного исправить код. Просто простая копия -> вставка не будет работать!

+0

благодарю вас за ответ! Раньше я пробовал подобное решение. Я обновлю свой код выше, чтобы показать вам содержимое экземпляра товаров. На самом деле это класс с именем Stops (который является разборным), который содержит массив фактического класса с именем товаров (что также является возможным) –

+0

Итак, каково текущее состояние проблемы? Вы помогли решить его? –

+0

все еще борется с ним. Как я уже сказал, я попытался использовать такое решение, как ранее, но, поскольку я не мог заставить его работать, я попытался сделать что-то другое. –

0

Put это в вашей деятельности тег манифеста

android:configChanges="orientation|keyboardHidden|screenSize" 

Надежда, что поможет.

+0

Я действительно думал об этом, но это казалось плохим решением для чего-то, что может быть проблемой в более масштабном масштабе. +1, потому что это сделало меня LOL, хотя! спасибо Rv –

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