私は、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後
をデータパースされている。アクティビティのレイアウトには、画面がタイムアウトするまでカードビューが表示されず、ボタンを押して再表示します。しかし、画面がタイムアウトするのを待っている間に電源キーを押して電話を開けると、カードビューは表示されません。だから、画面がタイムアウトしたときだけ表示され、ボタンを押してもう一度表示します。
カードビューが表示された後、またはその前に、ローテーションなどのコンフィグレーション変更が発生した場合は、
getData()
が呼び出され、PostItems
が読み込まれ、問題1が再び発生します。アクティビティの再作成時にgetData
が呼び出されないようにすることはできますか?- アプリが起動すると、インターネット接続を確認します。使用できない場合は、への再試行またはのキャンセルダイアログが表示されます。しかし、利用可能であれば
getData
が呼び出され、mProgressDialog
が表示されます。現在、mProgressDialog
はインターネットが利用できなくなることが示されていますが、アクティビティは検出できず、mProgressDialog
は永遠まで表示され続けます。mProgressDialog
が表示されているか、JSONがまだ読み込まれている間、インターネット接続をチェックする方法がわかりません。
あなたは記入データでarraylistをonSavedInstanceメソッドに保存する必要があります。 arraylistでアダプタを設定するときに、araaylistを確認する必要がありますnullをしてゼロより大きいし、アダプタを設定します –
これを示唆している問題を知っていますか? –
recylerビューのデータを失うときにortientationが変更された後 –