2017-11-29 25 views
0

私はアンドロイド開発プロジェクトでListViewとその関連データを持っている問題を手にしてください。android-listview戻るボタンを押したときにデータの行が失われる

私のような活動のUserProfileの意向により開始されるOrderFormと呼ばれる活動がありますのUserProfileで

Intent intent = new Intent(this, OrderForm.class); 
     startActivity(intent); 

が続いてOrderFormでのEditTextとするには、[追加]ボタンがありますString項目をArrayListに追加すると、それに応じてUIが生成されます。

[戻る]ボタン(UserProfileに戻って)をクリックして再度Intent to OrderFormを実行すると、UIにリスト項目が表示されません。なぜですか?

私は、永続性とSharedPreferencesでもRoomを使用できることを認識していますが、 よりクリーンで効率的な方法があるかどうかを確認したいと思います。

また、私はそれらを正しく理解していないかもしれませんが、私はonSaveInstanceStateとonRestoreInstanceStateを試してみましたが、私のためには動作しません。

ありがとうございます。

は、ここでは、活動の仕事をライフサイクルを理解する必要がOrderForm

public class OrderForm extends AppCompatActivity { 

ArrayList<String> list; 
ListView itemList; 
ArrayAdapter<String> arrayAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_order_form); 

    itemList = findViewById(R.id.itemList); 

    itemText = findViewById(R.id.item); 
    linearLayout = findViewById(R.id.no_items_container); 
    orderContainer = findViewById(R.id.orderContainer); 

    list = new ArrayList<>(); 

    arrayAdapter = new ArrayAdapter<String>(this, 
      R.layout.list_item,R.id.rowItem, list) 
    { 
     @Override 
     public View getView(int position, 
          View convertView, 
          ViewGroup parent) { 
      // some custom stuff here 
     } 
    } 

public void addItem(View view) 
{ 
    String item = itemText.getText().toString().trim().toLowerCase(); 

    if(!item.isEmpty() && list.indexOf(item) == -1) { 
     arrayAdapter.add(item); 
    } 
} 
+0

あなたはアイテムを置くArrayListへの参照を失っているように思えます。もっとコードを表示する必要があります。具体的には、アレイアダプタのコードです。 – DigitalNinja

答えて

0

からコードの一部です。

https://developer.android.com/guide/components/activities/activity-lifecycle.html

あなたの問題は、戻るボタンを押すと、お使いのOrderForm活性が破壊され、効果的にあなたのArrayList /リストビューが破壊されていることです。この問題を回避するには、SharedPreferencesのような値を保存したり、文字列を保持するテキストファイルを作成して保存したり、arroylistを保存して処理するUserProfileクラスに戻したりする必要がありますstartActivityForResult()の代わりに、startActivity()を使用して)

+0

もちろん、私はSharedPreferencesを使うことができますが、私にとっては直感的ではありません。私が迷っている場合は私を訂正しますが、このメカニズムは、名前が示すように、ユーザーデータではなく、プリファレンスデータを保存します。 –

+0

@MichaelTheodoreはSharedPreferences内に "preferences"を保存することだけを心配する必要はありません。あらゆる種類のKey-Valueデータを保存するための軽量な方法です。 –

0

私は(バックのUserProfileに)[戻る]ボタンをクリックして、再びOrde​​rFormする意図を経由して行くと、UIは、リスト項目を表示しません、それはなぜですか?あなたのonCreate()方法で

、あなたはこの持っている:あなたはいくつかの方法でデータを永続化する場合を除き

list = new ArrayList<>(); 
arrayAdapter = new ArrayAdapter<String>(..., list)... 

を、listは常にあなたの活動の起動時に空になるだろう。

私は、永続性とSharedPreferencesのためにRoomを使用できることを実感しましたが、よりクリーンで効率的な方法があるかどうかを確認したいと思いました。

保存する必要があるものは、保存するのに最適な方法を定義するのに役立ちます。単純な文字列のリストについては、おそらくSharedPreferencesが最も簡単な解決策です。

また、私はそれらを正しく理解していないかもしれませんが、私はonSaveInstanceStateとonRestoreInstanceStateを試してみましたが、それらは私のためには機能しません。

活性が破壊した後、を再作成されたときにこれらのメソッドは、ユーザーがデバイスを回転すると、一般的に起こる(だけでなく、他の様々な理由で発生する可能性)は、データを格納するために使用されます。 ユーザーアクティビティを終了すると(ユーザープロファイルにbackを押して)、これらのメソッドはトリガされません。

関連する問題