2017-10-28 4 views
1

私はアンドロイドでwebserviceを使って作業しています。私はlynda.comの チュートリアルに従っていました。私は塔の中を通りました。私はwebserviceからデータ を取得し、それを "ListView"に表示します。私はMainContactクラス と、IntentServcieを拡張するMyServiceクラスと、パーセルブルを実装するPOJOクラス名Courseを持っています。それは私が をクリックすると得られるWebサービスの応答の一部を保持します。たMyServiceクラスでonSaveInstanceStateでの作業方法android orientation change

public class MainActivity extends AppCompatActivity { 
//member variables I have 
    ListView listview; 
    List<String> courseList = new ArrayList<>(); 
    ArrayAdapter<String> adapter; 
    Course[] courses; 
...... 
    public void runClickHandler(View view) { 
     Intent intent = new Intent(this, MyService.class); 
     //the url where I extract the JSON data 
     intent.setData(Uri.parse(JSON_URL)); 
     startService(intent); 

    } 

Webサービスからの応答をダウンロードし、 私はJSON、パッケージにデータを変換し、LocalBroadcastManagerを使用してMainActivityに送信するGSONライブラリを使用して接続

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.addRequestProperty("Authorization", TOKEN); 

を開きます。私のMainActivityで

protected void onHandleIntent(Intent intent) { 
      ........... 
      messageIntent.putExtra(MY_SERVICE_PAYLOAD, courseList); 
     //we package the data we want to share to the rest of the applicaiton 
     LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getApplicationContext()); 
     manager.sendBroadcast(messageIntent); 
     } 

私は、データを取得し、リストビューに表示するBroadcastReceiverを使用しています。 BroadcastReceiverのOnReceiveメソッドの内部。私は、画面の向きを変更すると、この

public void onReceive(Context context, Intent intent) { 
      courses = (Course[]) intent.getParcelableArrayExtra(MyService.MY_SERVICE_PAYLOAD); 

      for (Course course : courses) { 

       courseList.add(course.getCourseTitle()); 
      } 
      Collections.sort(courseList); 

      adapter = new ArrayAdapter<String>(
        MainActivity.this, 
        android.R.layout.simple_expandable_list_item_1, 
        courseList); 

      listview.setAdapter(adapter); 

     } 

問題が来ています。私がwebserviceから得たデータは破壊されます。私はXMLファイルの設定を推奨し、画面サイズの変更を調整しました。これは「良いアプローチ」ではないとも考えられます。私が使っていると思ったのは、ここやオンラインの他の投稿で提案されているように、onSaveInstanceStateを無効にすることです。私は作品をつなぎ、オリエンテーションの変更中に自分のデータを保持するのに苦労します。 私はどのように物事を処理する必要がありますか?あなたが読んだ良い記事や、上記の私の実装に基づいてどのように問題に近づいていくのか、私は感謝しています。 if(savedInstanceState!= null)をチェックした後、display onCreateをどのように処理するのですか?どのメンバー変数データを保存する必要がありますか?すべてがnull onDestroy()に変更されますか?これは私が

protected void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

    LocalBroadcastManager.getInstance(getApplicationContext()) 
    .registerReceiver(mBroadcastReceiver,new IntentFilter(MyService.MY_SERVICE_MESSAGE)); 

      listview = (ListView) findViewById(R.id.list); 

     } 

答えて

0

1.

onSaveInstanceState(Bundle out) { 
    out.putParcelableArrayList("COURSES", courseList); 
} 

2.

onCreate(Bundle savedState) { 
    // ... 
    if (savedState != null) { 
     courseList = savedState.getParcelableArrayList("COURSES"); 
    } 
} 

P.S.を持っているのonCreate()メソッドであります * https://developer.android.com/reference/android/os/Bundle.html * https://developer.android.com/guide/components/activities/activity-lifecycle.html#saras

+0

私がonSaveInstanceStateに提案した内容を追加すると、第2引数の型が間違っています。見つかった: 'java.util.List '、必須: 'java.util.ArrayList <?拡張するandroid.os。Parcelable> – user1986244

+0

私はあなたのフィードバックをout.putParcelableArray( "COURSES"、courses)を使用するように更新しました。 onCreate()私はコースコースを取得しました=(Course [])savedInstanceState.getParcelableArray( "COURSES");私はまだコースを表示する主要な問題があります。当初、コースはonClickトリガーで表示されました。画面の回転が表示されます – user1986244

0

私が質問を投稿する前にも、私はチュートリアルを見て、応答をstackoverflowのしています。消化するのには時間がかかりました。 MaxVは私に正しい方向を指摘しました。 savedInstanceStateに私は、私はコースの配列を取得しています、と私はdisplayListOfCoursesを作成しcouresリスト

if (savedInstanceState != null) { 

      courses = (Course[])savedInstanceState.getParcelableArray("COURSES"); 
      displayListOfCourses(courses); 
     } 

を表示するには、別のヘルパーメソッドを作成し、私は参加したこの

//I have coures parcelable array object as a member variable 
// Course[] courses; 
@Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putParcelableArray("COURSES", courses); 

    } 

のOnCreate()メソッドを追加しました私が以前に持っていたBroadcastRecieverのコードを再利用可能にしました。私の最初の仮定は、リストが何とかリストが表示されるようにすることでした。今、私の理解では、ビューオブジェクト、ListView、およびarrayAdapterを作成し、ビューを自分で再構築する必要があります。

public void displayListOfCourses(Course[] courses){ 
     for (Course course : courses) { 

      courseList.add(course.getCourseTitle()); 
     } 
     Collections.sort(courseList); 

     adapter = new ArrayAdapter<String>(
       MainActivity.this, 
       android.R.layout.simple_expandable_list_item_1, 
       courseList); 

     listview.setAdapter(adapter); 

    } 
関連する問題