1

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.

Antwort

0

Wenn Sie Ihren Bildschirm drehen. Ihr Aktivitätsstatus wird gespeichert und an die onActivityCreated-Methode Ihres Fragments übergeben. Was Sie also tun können, wenn Sie überprüfen, ob der CLUB_NEWS-Schlüssel im Bundle vorhanden ist und das Bundle nicht null ist.

@Override 
protected void onActivityCreated(Bundle state){ 
    if(state != null){ 
     //fill adapter with data from 
     // state using CLUB_NEWS key 

    }else{ 

     //fill adapter with data from 
     // web service 
    } 

}

PS; Konnte nicht viel tippen, auf meinem Handy

+0

Das verstehe ich nicht. Wie fülle ich den Adapter vom CLUB_NEWS Schlüssel! – Theo

+0

Wo ist Ihr Adaptercode? Normalerweise für diese Art von Daten können Sie ArrayAdapter – peter

+0

Unterklasse entnehmen Bitte lesen Sie meine Bearbeitung. Der Adapter ist da. – Theo

0

Ok. Ich habe es repariert. Ich musste den Zustand des Fragments in meiner Haupttätigkeit speichern :).

Verwandte Themen