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;
}
}
Bitte schauen Sie sich meinen editted Code an. Die Rotation kann so verwirrend sein :( – Theo
@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
Sie meinen also, eine if-Anweisung in meine Updatelistenmethode zu setzen, wo ich meinen Adapter habe? – Theo