1

これは私のケースです。私は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サービスはデバイスの回転後に実行されています。

答えて

0

画面を回転させるとき。アクティビティの状態が保存され、フラグメントの onActivityCreatedメソッドに渡されます。したがって、CLUB_NEWSキーがバンドルに存在し、バンドルがヌルでないかどうかを確認する場合はどうすればよいでしょうか。

@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。モバイルで多くのタイプを入力できませんでした。

+0

これは私が理解できないものです。 CLUB_NEWSキーからアダプタを埋める方法 – Theo

+0

アダプタコードはどこにありますか?通常、そのようなデータの場合は、ArrayAdapterサブクラス化することがあります – peter

+0

私の編集をご覧ください。アダプターはそこにあります。 – Theo

0

それを私が直した。私は主な活動の中で断片の状態を保存しなければなりませんでした:)。

関連する問題