2016-05-03 1 views
1

配列/リストに値を追加して共有設定に保存し、別のアクティビティに表示したいとします。Javaでボタンをクリックすると、リストに反復的に追加するにはどうすればよいですか?

私は自分のコードを試してみると、最初の値を保存するように見えるだけです。さらに追加すると、値が上書きされます。

私はボタンをクリックするたびにリストを作成したくないので、最初に置いておきます。

既存の値がない場合、メッセージはリストに追加して共有設定にStatus_0として保存する必要があります。既存の値がある場合はStatus_1として追加する必要がありますが、そうではありません。私はそれがリストに適切に保存されていないためだと思うが、私はそれを行う方法がわからない。ここで

は私のコードです:

public class EnterReadingsActivity extends AppCompatActivity implements  View.OnClickListener { 
private EditText erTemperatureEditText; 
private Button erSubmitBtn; 
public List<String> values = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Utils.onActivityCreateSetTheme(this); 
    setContentView(R.layout.activity_enterreadings); 
    init(); 

} 

private void init() { 
    erTemperatureEditText = (EditText) findViewById(R.id.erTemperatureEditText); 
    erSubmitBtn = (Button) findViewById(R.id.erSubmitBtn); 
    erSubmitBtn.setOnClickListener(this); 
} 

@Override 
public void onClick(View view) { 
    if (view.getId()==R.id.erSubmitBtn) { 
     SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE); 
     SharedPreferences.Editor editor = pref.edit(); 

     String message = erTemperatureEditText.getText().toString(); 

     editor.putInt("Status_size", values.size()); 
     int status_size = values.size(); 

     for (int i = status_size; i < status_size + 1; i++) { 
      editor.putString("Status_" + i, message); 
      values.add(message); 
      editor.commit(); 
      } 
     } 
    } 
} 

編集:

int status_size = values.size(); 
    for(int i = 0; i < status_size + 1; i++) 
    { 
     String value = values.get(i); 
     if (value != null) { 
      values.add(value); 
      status_size++; 

      String textView_i = "textView" + i; 
      TextView textView_i = new TextView(this); 
      textView_i.setLayoutParams(new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, 
        ActionBar.LayoutParams.WRAP_CONTENT)); 
      textView_i.setText(value); 
      historyBackgroundInside.addView(textView_i); 

     } 
    } 
+0

誰かがちょうど建設的なコメントを与えたが、今ではなくなって...これは私の返事だったでしょう。おかげでたくさん、リストには値がないように開始するように、空でなければなりません - と私はリストに "values.add(message);"を追加していると思ったforループの内側にあります。そして、status_size + 1だったのは、リストに2つのエントリがあり、i = 2であり、最初の実行で実行され、i ++のために停止するからです。 – user2633709

+0

それを 'ArrayList'に追加していますが、どこに/ howを表示しようとしていますか?いくつかのタイプの 'Adapter'を使うべきです(' ListView'でそれを表示したいと仮定し、基底のリストを更新するときに 'adapterName.notifyDatasetChanged()'を呼び出す必要があります)。 – codeMagic

+0

私の次のアクティビティーでは、各レコードのテキストビューを作成し、値を表示します。共有プリファレンスに渡すことができます。 – user2633709

答えて

0

別の活動からのデータを渡すためにsharedPreferencesを使用することが間違っています。 通常、データはインテントで渡され、次のアクティビティで使用されるオブジェクト(バンドル)に入力されます。

別の方法は、このコード

public class NameOfYourNextActivity extends AppCompatActivity { 
    public List<String> values; 
    public ListView listView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Utils.onActivityCreateSetTheme(this); 
     setContentView(R.layout.activity_nameoflayout); 

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

     Intent intent = getIntent(); 

     //If you first method 
     if (intent != null && intent.hasExtra("status_list")) { 
       List<String> values = (List<String>)intent.getSerializableExtra("status_list") 
     } 
     //If you second method (Bundle) 
     // if (intent != null && intent.hasExtra("Bundle")) { 
     // Bundle bundle = intent. getBundleExtra("Bundle") 
     // if (bundle != null && bundle.containsKey("status_list")) { 
     // List<String> values = (List<String>)intent.getSerializableExtra(String name) 
     // } 

     if (values != null) { 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
    android.R.layout.simple_list_item_1, android.R.id.text1, values); 
      listview.setAdapter(adapter); 
     } 
     } 
    } 

を使用して他の活性値に取るようにバンドル

public class EnterReadingsActivity extends AppCompatActivity implements View.OnClickListener { 
    private EditText erTemperatureEditText; 
    private Button erSubmitBtn; 
    public List<String> values = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Utils.onActivityCreateSetTheme(this); 
     setContentView(R.layout.activity_enterreadings); 
     init(); 
    } 

    private void init() { 
     erTemperatureEditText = (EditText) findViewById(R.id.erTemperatureEditText); 
     erSubmitBtn = (Button) findViewById(R.id.erSubmitBtn); 
     erSubmitBtn.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 
      if (view.getId()==R.id.erSubmitBtn) { 
       String message = erTemperatureEditText.getText().toString(); 
       values.add(message); 
      } 

      //Here you should enter the condition that allows you to 
      //call the method to go to the next activity 
      //ex: click of a button, I have the list reaches a size 
      //Add a example code 
      if (values.size() == 10) { 
       passDataAndGoInAnotherActivity(); 
      } 
    } 

    public void passDataAndGoInAnotherActivity() { 
     Intent i = new Intent (this, NameOfYouNextActivity.class); 

     i.putExtra("status_list", values); 
     // Or use Bundle 
     // Bundle bundle = new Bundle(); 
     // bundle.putSerializable("status_list", values); 
     // i.putExtra("bundle", values) 
     startActivity(i) 
    } 
} 

のように働くのエキストラを使用することです私はあなたを与えるために、コードの更新をしましたあなたが必要とするものに近づくソリューション。

次のアクティビティを作成し、マニフェストに挿入することを忘れないでください。

アクティビティに基づいてクラスの名前を変更し、正しいレイアウト名を入力します。

あなたの値を印刷するためのリストビュー(私のコードではIDの変更)をレイアウトに含めてください。

この例では、Androidによって提供されるレイアウトの単純なアダプタを使用していますが、カスタムを作成できます。

ここでは、優れたguide

+0

*「sharedPreferencesを使用して1つのアクティビティから別のアクティビティにデータを渡すのは間違いです。」*いいえ、正しくありません。そのデータの必要性に応じて、 'SharedPreferences'を使うことができます。はい、ときどきバンドルが意味をなさないことがありますが、ここで 'SharedPreferences'を使うのは間違っていると言ってしまいます...これは間違っていて、実際には何らかの問題を解決するとは思えません。 – codeMagic

+0

はい、それは間違いなく使用可能で、私の答えは不明確で、間違っています。しかし、useSharedPreferencesを使用して、不定数(0から無限大)の値のリストを渡すと、それは汚い習慣になります。 –

+0

私はこのケースでは良い考えではないと思いますが、一般に間違っているとは必ずしも言えません。 – codeMagic

関連する問題