2016-05-07 7 views
1

In meiner App lese ich Daten aus einer Datenbank, die ich erstellt habe. Abgesehen von der Rotation funktioniert alles gut. Wenn ich das Telefon rotiere, bekomme ich keine Ausnahmen, aber der Webservice läuft wieder und ich will das nicht. Nach einigen Recherchen fand ich heraus, dass meine Modellklasse die Parcelable-Schnittstelle implementieren sollte. Hier ist, was ich nach google's Android Guide Site gemacht habe.Parcelable Klasse und ArrayLists in Android

public class FootballNewsObject implements Parcelable{ 
String title; 
String article; 
String image; 

public FootballNewsObject() { 

} 

public FootballNewsObject(Parcel in) { 
    title = in.readString(); 
    article = in.readString(); 
    image = in.readString(); 
} 


public void setArticle(String article) { 
    this.article = article; 
} 

public void setImage(String image) { 
    this.image = image; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getArticle() { 
    return article; 
} 

public String getTitle() { 
    return title; 
} 

public String getImage() { 
    return image; 
} 



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

@Override 
public void writeToParcel(Parcel dest, int flags) { 

    dest.writeString(title); 
    dest.writeString(article); 
    dest.writeString(image); 
} 
public static final Creator<FootballNewsObject> CREATOR = new Creator<FootballNewsObject>() { 
    @Override 
    public FootballNewsObject createFromParcel(Parcel in) { 
     Log.v("Theo","Create from parser: Movies"); 
     return new FootballNewsObject(in); 
    } 

    @Override 
    public FootballNewsObject[] newArray(int size) { 
     return new FootballNewsObject[size]; 
    } 
}; 
} 

Und natürlich habe ich ein Fragment, wo ich nehme, Pflege der Ansichten und der tatsächlichen webservice die Volley-Bibliothek verwenden.

public class FootballNews extends Fragment { 

public static final String TAG = "ManuApp"; 
private static final String IMAGE_URL = "my link goes here" ; 
private static final String FL_NEWS ="FL NEWS" ; 
private List<FootballNewsObject> listItemsList; 

private RecyclerView mRecyclerView; 
private FootballNewsAdapter adapter; 

public FootballNews() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    setRetainInstance(true); 
    View v = inflater.inflate(R.layout.fragment_football_news, container, false); 
    // Inflate the layout for this fragment 
    listItemsList = new ArrayList<FootballNewsObject>(); 
    mRecyclerView = (RecyclerView)v.findViewById(R.id.recycler_view); 
    //mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(getActivity()).color(Color.BLACK).build()); 
    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
    mRecyclerView.setLayoutManager(linearLayoutManager); 

    if(savedInstanceState!=null){ 
     listItemsList = savedInstanceState.getParcelableArrayList(FL_NEWS); 
    } 
    return v; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    updateList(); 


} 
public void updateList() { 

    listItemsList.clear(); 


    //declare the adapter and attach it to the recyclerview 
    adapter = new FootballNewsAdapter(getActivity(), listItemsList); 
    mRecyclerView.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
    // Instantiate the RequestQueue. 
    RequestQueue queue = Volley.newRequestQueue(getActivity()); 

    // Clear the adapter because new data is being added from a new subreddit 
    //adapter.clearAdapter(); 

    //showPD(); 

    // Request a string response from the provided URL. 
    JsonArrayRequest jsObjRequest = new JsonArrayRequest(Request.Method.GET, Config.URL_FOOTBALL_NEWS, new Response.Listener<JSONArray>() { 

     @Override 
     public void onResponse(JSONArray response) { 

      Log.d(TAG, response.toString()); 
      //hidePD(); 

      // Parse json data. 
      // Declare the json objects that we need and then for loop through the children array. 
      // Do the json parse in a try catch block to catch the exceptions 
      try { 



       for (int i = 0; i < response.length(); i++) { 

        JSONObject post = response.getJSONObject(i); 
        FootballNewsObject item = new FootballNewsObject(); 
        item.setTitle(post.getString("title")); 
        item.setImage(IMAGE_URL + post.getString("news_image")); 
        item.setArticle(post.getString("article")); 



        listItemsList.add(item); 

       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      // Update list by notifying the adapter of changes 
      adapter.notifyDataSetChanged(); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.d(TAG, "Error: " + error.getMessage()); 
      //hidePD(); 
     } 
    }); 
    jsObjRequest.setRetryPolicy(new RetryPolicy() { 
     @Override 
     public int getCurrentTimeout() { 
      return 50000; 
     } 

     @Override 
     public int getCurrentRetryCount() { 
      return 50000; 
     } 

     @Override 
     public void retry(VolleyError error) throws VolleyError { 

     } 
    }); 
    queue.add(jsObjRequest); 

} 


protected boolean isOnline() { 
    ConnectivityManager cm = (ConnectivityManager)getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.isConnectedOrConnecting()) { 
     return true; 
    } else { 
     return false; 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putParcelableArrayList(FL_NEWS, (ArrayList<? extends 
    Parcelable>) listItemsList); 
    } 
} 

Wie Sie sehen, ich bin mit meiner Liste der Daten in Parcel speichern

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putParcelableArrayList(FL_NEWS, (ArrayList<? extends  
    Parcelable>) listItemsList); 
} 

Und wenn die savedInstance nicht null ist nur die Daten zu erhalten.

if(savedInstanceState!=null){ 
     listItemsList = savedInstanceState.getParcelableArrayList(FL_NEWS); 
    } 

Aber wie ich eingangs schon sagte, läuft der Webservice nach der Rotation wieder. Was soll ich tun, um das zu stoppen?

Danke.

EDIT

habe ich versucht, dies aber immer noch die gleiche propblem

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    if(gottaGettaList = (savedInstanceState==null)) { 
     updateList(); 
    }else{ 
     gottaGettaList=false; 
    } 

} 

Antwort

0

Ihre onActivityCreated() Anrufe updateList(). Unter updateList() rufen Sie immer den Web-Service auf. Wenn Sie den Web-Service nicht immer aufrufen möchten, ändern Sie updateList() so, dass ein Test if verwendet wird, um zu entscheiden, ob der Web-Service aufgerufen werden soll oder nicht.

Zum Beispiel, wenn die Regel ist „wenn wir von einer Konfigurationsänderung kommen, setzen Sie das Web-Service nicht aufrufen“, dann könnten Sie:

Schritt # 1: Fügen Sie einen boolean gottaGettaList Parameter updateList()

Schritt 2: Rufen Sie updateList(savedInstanceState==null) in onActivityCreated()

Schritt # 3: in updateList(), nur den Web-Service aufrufen, wenn gottaGettaListtrue ist.

+0

Bitte schauen Sie sich meinen editted Code an. Die Rotation kann so verwirrend sein :( – Theo

+0

@Theo: Du kannst 'updateList() 'nicht komplett überspringen, da du die Liste in den Adapter stellst. Allerdings solltest du den mit Volley verbundenen Code überspringen. Übrigens, ich habe es vergessen das 'onActivityCreated()' hatte das 'Bündel', also vereinfachte ich meine Schritte. – CommonsWare

+0

Sie meinen also, eine if-Anweisung in meine Updatelistenmethode zu setzen, wo ich meinen Adapter habe? – Theo

0

Ok ich glaube, ich es fest, als WebService in nicht zweimal laufen :)

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
     if(savedInstanceState==null) { 
      updateList(); 
     }else{ 
      adapter = new FootballNewsAdapter(getActivity(), listItemsList); 
      mRecyclerView.setAdapter(adapter); 
      adapter.notifyDataSetChanged(); 
     } 
} 

Während der Drehung ich meinen Adapters wieder bin Befestigung :). Ohne den Adapter in der else-Anweisung anzuhängen, erhielt ich einen leeren Bildschirm und eine Nachricht.

E/RecyclerView: No adapter attached; skipping layout 
Verwandte Themen