【问题标题】:ArrayList shared preference overwritten everytime I start a new activity每次开始新活动时都会覆盖 ArrayList 共享首选项
【发布时间】:2019-11-15 23:47:50
【问题描述】:

我有一个字符串数组列表,MainActivity 读取字符串,然后将其转换为 Gson,然后应用程序继续执行下一个活动(history.class 活动),然后通过检索它打印出数组列表。我已经实现了一个返回到 MainActivity 的按钮,但是每次我返回到 MainActivity 时,arraylist 都会被覆盖,有没有办法克服这个问题?另外,我不想使用close()finish()作为返回MainActivity的方式。

MainActivity.class

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final ArrayList<String> arrPackage;
        setContentView(R.layout.activity_main);
        final SharedPreferences sharedPreferences = getSharedPreferences("USER",MODE_PRIVATE);
        final EditText address = findViewById(R.id.address);
        final TextView result = findViewById(R.id.result);
        Button save = findViewById(R.id.button);

        arrPackage = new ArrayList<>();
        final Intent next = new Intent(this,history.class);
        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(address.getText().toString().isEmpty()) {
                    Toast.makeText(MainActivity.this,"Plz Enter all the data",Toast.LENGTH_LONG).show();
                }else{
                    String addressData = address.getText().toString().trim();
                    arrPackage.add(addressData);
                    Gson gson = new Gson();
                    String json = gson.toJson(arrPackage);
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putString("Set",json );
                    editor.commit();
                }
                startActivity(next);
            }
        });
    }
}

History.class

public class history extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_history);
        Button back = findViewById(R.id.back_btn);
        TextView result = findViewById(R.id.tv_history);
        final Intent back_activity = new Intent(this,MainActivity.class);
        final SharedPreferences sharedPreferences = getSharedPreferences("USER",MODE_PRIVATE);

        Gson gson = new Gson();
        String json = sharedPreferences.getString("Set", "");
        if (json.isEmpty()) {
            Toast.makeText(history.this,"There is something error",Toast.LENGTH_LONG).show();
        } else {
            Type type = new TypeToken<List<String>>() {
            }.getType();
            List<String> arrPackageData = gson.fromJson(json, type);
            StringBuilder builder = new StringBuilder();

            for(String data:arrPackageData) {
                builder.append(data + "\n");
            }
            result.setText(builder.toString());

        }
        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(back_activity);
            }
        });
    }
}

【问题讨论】:

    标签: java android android-intent arraylist sharedpreferences


    【解决方案1】:

    在您的 Activity 条目内的 AndroidManifest.xml 中添加这一行:

    android:launchMode="singleTask"
    

    例如:

    <activity
            android:name="your_package.MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask">
    </activity>
    

    这样,您的 MainActivity 将成为单实例 Activity,当您为其调用 startActivity 时,已经创建的 Activity 将出现在前台。

    【讨论】:

      【解决方案2】:
      arrPackage = new ArrayList<>();
      

      这一行会覆盖你的arrayList。要保存您的arrayList,您需要先检查首选项列表中是否有数据保存为

      Gson gson = new Gson();
          String json = sharedPreferences.getString("Set", "");
      
          if (json.isEmpty()) {
              // runs when you app dont have data in shared preference initalize your arrayList here
              arrPackage = new ArrayList<>();
          } else {
              // when your app already stored list then read from the preference.
              Type type = new TypeToken<List<String>>() {
              }.getType();
              arrPackage  = gson.fromJson(json, type);
          }
      

      【讨论】:

      • 我在哪里包含您编写的代码部分,我似乎无法弄清楚。
      • arrPackage = new ArrayList();替换为这个
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      相关资源
      最近更新 更多