如何在java中按钮单击时迭代添加到List?

时间:2016-05-03 19:55:01

标签: java android sharedpreferences

我想将值添加到数组/列表中,然后将它们存储在共享首选项中,然后显示在另一个活动上。

当我尝试我的代码时,它似乎只保存第一个值,如果我添加更多它只会覆盖该值。

每次点击按钮我都不想创建List,所以我把它放在最开头。

如果没有现有值,则应将消息添加到列表中并作为Status_0存储在共享首选项中,如果存在现有值,则应将其添加为Status_1 - 但事实并非如此。我认为这是因为它没有在List中正确保存,但我不知道该怎么做。

这是我的代码:

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);

        }
    }

1 个答案:

答案 0 :(得分:0)

使用sharedPreferences将数据从一个活动传递到另一个活动是不正确的。 数据通常输入到一个对象(Bundle)中,该对象将在意图中传递,然后在下一个活动中被接收。

另一种方法是使用像Bundle

这样的附加功能
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)
     }
}

使用此代码

接收其他活动值
 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);
         }
       }
    }

我更新了代码,为您提供了一个接近您需要的解决方案..

请记住创建下一个活动并将其插入清单。

根据您的活动更改班级名称,并输入正确的布局名称。

请记住在您的布局中包含一个列表视图(在我的代码中更改ID),以便您打印您的值。

在此示例中,它使用Android提供的布局的简单适配器,但您可以创建自定义内容。

在这里,您会找到一个优秀的guide