Hier ist mein Fall. Ich hole mit Hilfe von Volley Library einige Daten aus einer Datenbank. Alles funktioniert gut. Wenn ich jedoch den Bildschirm rotiere, läuft der Webservice wieder und ich möchte nicht, dass dies geschieht. Also hier sind die Schritte, denen ich gefolgt bin.Anzeige gespeicherter Daten nach Rotation in einem RecyclerView
1) In meinem Modellobjekt implementiere ich die Schnittstelle Parcelable
, die die Daten enthält, die ich speichern möchte.
2) Ich überschreibe die onSaveInstanceState Methode, um die Daten zu speichern, wenn ich den Bildschirm rotiere. Dieser Teil funktioniert.
3) Als nächstes stelle ich diese Daten nach dem Drehen des Telefons wieder her, indem ich diese Zeile benutze, die auch funktioniert :).
listItemsList = savedInstanceState.getParcelableArrayList(CLUB_NEWS);
Wie ich schon sagte der Webservice wieder nach der Drehung ausgeführt wird. Ich habe das behoben, indem ich einzelne Werte für verschiedene Webservices gelesen habe. Aber wenn es um Recyclerview geht, bin ich etwas verwirrt. Hier ist mein Code.
Modellobjekt
public class ClubNewsObject implements Parcelable{
String title;
public ClubNewsObject(){
}
public ClubNewsObject(Parcel in) {
title = in.readString();
article = in.readString();
image = in.readString();
}
public static final Creator<ClubNewsObject> CREATOR = new Creator<ClubNewsObject>() {
@Override
public ClubNewsObject createFromParcel(Parcel in) {
return new ClubNewsObject(in);
}
@Override
public ClubNewsObject[] newArray(int size) {
return new ClubNewsObject[size];
}
};
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;
}
String article;
String image;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(title);
dest.writeString(article);
dest.writeString(image);
}
}
ClubNewsFragment
public class ClubNewsFragment extends Fragment {
public static final String TAG = "ManuApp";
private static final String IMAGE_URL = "xxxxxx" ;
private static final String CLUB_NEWS ="Club news" ;
private ArrayList<ClubNewsObject> listItemsList;
LinearLayoutManager linearLayoutManager;
private RecyclerView mRecyclerView;
private ClubNewsAdapter adapter;
private Parcelable mListState;
public ClubNewsFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_club_news, container, false);
// Inflate the layout for this fragment
listItemsList = new ArrayList<>();
mRecyclerView = (RecyclerView)v.findViewById(R.id.club_news_recycler_view);
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(linearLayoutManager);
adapter = new ClubNewsAdapter(getActivity(), listItemsList);
mRecyclerView.setAdapter(adapter);
if(savedInstanceState!=null){
listItemsList = savedInstanceState.getParcelableArrayList(CLUB_NEWS);
}
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(savedInstanceState==null) {
updateClubNewsList();
}
}
public void updateClubNewsList() {
listItemsList.clear();
//declare the adapter and attach it to the recyclerview
// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(getActivity());
// Request a string response from the provided URL.
JsonArrayRequest jsObjRequest = new JsonArrayRequest(Request.Method.GET, Config.URL_CLUB_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);
ClubNewsObject item = new ClubNewsObject();
item.setTitle(post.getString("title"));
item.setImage(IMAGE_URL + post.getString("images"));
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();
}
});
queue.add(jsObjRequest);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelableArrayList(CLUB_NEWS,listItemsList);
}
}
Ich denke, alle Trick innerhalb des onCreateView(...)
Methode des Fragments ist, wo ich alle Daten erfolgreich wiederherstellen.
Irgendwelche Ideen?
Danke,
Theo.
EDIT
Auf meinem Adapter Code habe ich eine zusätzliche Methode namens setClubNews setzen.
public class ClubNewsAdapter extends RecyclerView.Adapter<ClubNewsRowHolder> {
private List<ClubNewsObject> clubNewsObjectList;
private Context mContext;
private ImageLoader mImageLoader;
private int focused = 0;
public ClubNewsAdapter(Activity activity, List<ClubNewsObject> clubNewsObjectList){
this.clubNewsObjectList = clubNewsObjectList;
this.mContext = activity;
}
@Override
public ClubNewsRowHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.club_news_row,null);
final ClubNewsRowHolder holder = new ClubNewsRowHolder(v);
return holder;
}
@Override
public void onBindViewHolder(ClubNewsRowHolder holder, int position) {
final ClubNewsObject listItems = clubNewsObjectList.get(position);
holder.itemView.setSelected(focused==position);
holder.getLayoutPosition();
mImageLoader = AppController.getInstance().getImageLoader();
holder.thumbnail.setImageUrl(listItems.getImage(),mImageLoader);
holder.thumbnail.setDefaultImageResId(R.drawable.reddit_placeholder);
holder.name.setText(Html.fromHtml(listItems.getTitle()));
holder.relativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String title = listItems.getTitle();
String article = listItems.getArticle();
String image = listItems.getImage();
Intent i = new Intent(mContext, Extras.class);
i.putExtra("title",title);
i.putExtra("article",article);
i.putExtra("image",image);
mContext.startActivity(i);
//Toast.makeText(mContext,"You clicked",Toast.LENGTH_SHORT).show();
//Intent intent = new Intent(mContext,WebActivity.class);
//intent.putExtra("url",postUrl);
// mContext.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return (null != clubNewsObjectList?clubNewsObjectList.size() :0);
}
public void setClubNews(ArrayList<ClubNewsObject> clNews) {
clubNewsObjectList = clNews;
//update the adapter to reflect the new set of movies
notifyDataSetChanged();
}
}
Und dann habe ich es nach dem Wiederherstellen der Daten in der onCreateView aufgerufen.
if(savedInstanceState!=null){
ArrayList<ClubNewsObject> items =
savedInstanceState.getParcelableArrayList(CLUB_NEWS);
adapter.setClubNews(items);
}else{
updateClubNewsList();
}
Aber immer noch läuft der Webservice nach der Rotation des Gerätes.
Das verstehe ich nicht. Wie fülle ich den Adapter vom CLUB_NEWS Schlüssel! – Theo
Wo ist Ihr Adaptercode? Normalerweise für diese Art von Daten können Sie ArrayAdapter – peter
Unterklasse entnehmen Bitte lesen Sie meine Bearbeitung. Der Adapter ist da. – Theo