2016-04-03 6 views
0

私は、Volleyを使用して、Cardviewにデータを取り込むためにデータを使用してRecyclerviewを読み込みます。CardViewsがRecyclerViewの読み込みを拒否する方法と、画面の回転後にメソッドが呼び出されないようにする方法

これは

public class MainActivity extends AppCompatActivity { 

    private final String TAG = "MainActivity"; 



    //Creating a list of posts 
    private List<PostItems> mPostItemsList; 

    //Creating Views 
    private RecyclerView recyclerView; 
    private RecyclerView.Adapter adapter; 
    private RecyclerView.LayoutManager layoutManager; 
    private ProgressDialog mProgressDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d(TAG, "Device rotated and onCreate called"); 

     //Initializing Views 
     recyclerView = (RecyclerView) findViewById(R.id.post_recycler); 
     layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 


     //Initializing the postlist 
     mPostItemsList = new ArrayList<>(); 
     adapter = new PostAdapter(mPostItemsList, this); 

     recyclerView.setAdapter(adapter); 

     if (NetworkCheck.isAvailableAndConnected(this)) { 
      //Caling method to get data 
      getData(); 
     } else { 
      final Context mContext; 
      mContext = this; 
      final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
      alertDialogBuilder.setTitle(R.string.alert_titl); 
      alertDialogBuilder.setMessage(R.string.alert_mess); 
      alertDialogBuilder.setPositiveButton(R.string.alert_posi, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        if (!NetworkCheck.isAvailableAndConnected(mContext)) { 
         alertDialogBuilder.show(); 
        } else { 
         getData(); 
        } 


       } 
      }); 
      alertDialogBuilder.setNegativeButton(R.string.alert_nega, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        finish(); 

       } 
      }); 
      alertDialogBuilder.show(); 

     } 

    } 

    //This method will get data from the web api 
    private void getData(){ 


     Log.d(TAG, "getData called"); 
     //Showing progress dialog 
     mProgressDialog = new ProgressDialog(MainActivity.this); 
     mProgressDialog.setCancelable(false); 
     mProgressDialog.setMessage(this.getResources().getString(R.string.load_post)); 
     mProgressDialog.show(); 

     //Creating a json request 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(ConfigPost.GET_URL, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         Log.d(TAG, "onResponse called"); 
         //Dismissing the progress dialog 
         if (mProgressDialog != null) { 
          mProgressDialog.hide(); 
         } 
         /*progressDialog.dismiss();*/ 


         //calling method to parse json array 
         parseData(response); 

        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

        } 
       }); 

     //Creating request queue 
     RequestQueue requestQueue = Volley.newRequestQueue(this); 

     //Adding request to the queue 
     requestQueue.add(jsonArrayRequest); 
    } 

    //This method will parse json data 
    private void parseData(JSONArray array){ 
     Log.d(TAG, "Parsing array"); 

     for(int i = 0; i<array.length(); i++) { 
      PostItems postItem = new PostItems(); 
      JSONObject jsonObject = null; 
      try { 
       jsonObject = array.getJSONObject(i); 
       postItem.setPost_title(jsonObject.getString(ConfigPost.TAG_POST_TITLE)); 
       postItem.setPost_body(jsonObject.getString(ConfigPost.TAG_POST_BODY)); 

} catch (JSONException w) { 
       w.printStackTrace(); 
      } 
      mPostItemsList.add(postItem); 
     } 

    } 


    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.d(TAG, "onDestroy called"); 
     if (mProgressDialog != null){ 
      mProgressDialog.dismiss(); 
      Log.d(TAG, "mProgress dialog dismissed"); 

     } 
    } 

MainActivityであり、これは、私はこれらのコードを持つ三つの問題が午前アダプター

public class PostAdapter extends RecyclerView.Adapter<PostAdapter.ViewHolder>{ 

    private Context mContext; 

    //List of posts 
    private List<PostItems> mPostItems; 



    public PostAdapter(List<PostItems> postItems, Context context) { 
     super(); 

     //Getting all posts 
     this.mPostItems = postItems; 
     this.mContext = context; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder (ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.post_summ, parent, false); 
     ViewHolder viewHolder = new ViewHolder(v); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     PostItems postList = mPostItems.get(position); 

     holder.postTitle.setText(postList.getPost_title()); 
     holder.postBody.setText(postList.getPost_body()); 
    } 


    @Override 
    public int getItemCount(){ 
     //Return the number of items in the data set 
     return mPostItems.size(); 
    } 

    class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView postTitle, postBody; 

     public ViewHolder (View postView) { 
      super(postView); 
      postTitle = (TextView) postView.findViewById(R.id.post_title); 
      postBody = (TextView) postView.findViewById(R.id.post_body); 
     } 
    } 


} 

です:JSON後

  1. をデータパースされている。アクティビティのレイアウトには、画面がタイムアウトするまでカードビューが表示されず、ボタンを押して再表示します。しかし、画面がタイムアウトするのを待っている間に電源キーを押して電話を開けると、カードビューは表示されません。だから、画面がタイムアウトしたときだけ表示され、ボタンを押してもう一度表示します。

  2. カードビューが表示された後、またはその前に、ローテーションなどのコンフィグレーション変更が発生した場合は、getData()が呼び出され、PostItemsが読み込まれ、問題1が再び発生します。アクティビティの再作成時にgetDataが呼び出されないようにすることはできますか?

  3. アプリが起動すると、インターネット接続を確認します。使用できない場合は、への再試行またはのキャンセルダイアログが表示されます。しかし、利用可能であればgetDataが呼び出され、mProgressDialogが表示されます。現在、mProgressDialogはインターネットが利用できなくなることが示されていますが、アクティビティは検出できず、mProgressDialogは永遠まで表示され続けます。 mProgressDialogが表示されているか、JSONがまだ読み込まれている間、インターネット接続をチェックする方法がわかりません。

答えて

0

RecyclerViewのオリエンテーション変更とネットワークモニタの基本的な概念がありませんでした。

  1. あなたはsetAdapterあなたはリストが空ですが、これを解決するには、Webサービスからデータを取得した後にsetAdapterを呼び出すか、データを取得した後にnotifyItemChangedを呼び出す必要があります。

  2. オリエンテーションの変更を解決するには、OnConfigurationChangedで処理する必要があります。

  3. ネットワークコールのタイムアウトを定義するのが一般的なので、基本的にはネットワークが切断されているかどうかに注意してください。それ以外の場合は、ネットワークの変更を監視する必要があります。 Refer this

+1

あなたは記入データでarraylistをonSavedInstanceメソッドに保存する必要があります。 arraylistでアダプタを設定するときに、araaylistを確認する必要がありますnullをしてゼロより大きいし、アダプタを設定します –

+0

これを示唆している問題を知っていますか? –

+0

recylerビューのデータを失うときにortientationが変更された後 –

関連する問題