これは私のケースです。私はVolley Libraryの助けを借りてデータベースからいくつかのデータを取得します。すべてうまく動作します。しかし、私は画面を回転すると、webserviceが再び実行されている、と私はこれが起こることを望んでいない。ここに私が従った手順があります。RecyclerViewで回転後の保存データを表示
1)モデルオブジェクトでは、保存したいデータを含むParcelable
インターフェイスを実装します。
2)私は画面を回転させるときにデータを保存するためにonSaveInstanceStateメソッドをオーバーライドします。その部分は機能しています。
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelableArrayList(CLUB_NEWS,listItemsList);
}
3)次の私はあまりにも正常に動作します:)そのラインを使用して、携帯電話を回転させた後、それらのデータを復元しています。
listItemsList = savedInstanceState.getParcelableArrayList(CLUB_NEWS);
私は、Webサービスがローテーション後に再び実行されていると述べました。私はこれを、さまざまなWebサービスの単一の値を読み取って修正しました。しかし、それはリサイクルビューになると私は少し混乱しています。ここに私のコードです。
モデルオブジェクト
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);
}
}
私はすべてのトリックは私が正常すべてのデータを復元するフラグメントのonCreateView(...)
メソッド内であると思います。
アイデア?ありがとう、
Theo。私アダプターコードに
EDIT
私はsetClubNewsと呼ばれる余分なメソッドを入れています。
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();
}
}
次に、onCreateView内のデータを復元した後に呼び出しました。
if(savedInstanceState!=null){
ArrayList<ClubNewsObject> items =
savedInstanceState.getParcelableArrayList(CLUB_NEWS);
adapter.setClubNews(items);
}else{
updateClubNewsList();
}
しかし、まだWebサービスはデバイスの回転後に実行されています。
これは私が理解できないものです。 CLUB_NEWSキーからアダプタを埋める方法 – Theo
アダプタコードはどこにありますか?通常、そのようなデータの場合は、ArrayAdapterサブクラス化することがあります – peter
私の編集をご覧ください。アダプターはそこにあります。 – Theo