首页 > 解决方案 > 如何在不访问其他活动的情况下将 arraylist 从活动发送到另一个活动

问题描述

我之前试图得到一个答案,但找不到一个可以解决我的问题的答案。我正在制作保持圆盘高尔夫分数的应用程序。我的 MainActivity 有 4 个按钮。新游戏,恢复游戏,课程和球员。

Atm 当用户进入 ActivityPlayers(主要活动中的播放器按钮)时,用户可以添加和删除播放器,并且共享首选项会保存该列表。但是现在我还需要以某种方式获取相同的玩家列表,到那个 ActivityNewGame(主要活动中的新游戏按钮),我需要遍历该列表,并使用这些名称在 ActivityNewGame 列表中创建新项目。(不能直接从 ActivityPlayers 复制列表,因为在那个 recyclerview 中,这些项目具有与新游戏 recyclerview 不同的按钮,即使它们使用相同的名称列表。)

我试图做意图,但我意识到我不能使用它,因为当用户从 ActivityPlayers 添加或删除玩家时,我必须访问那个 ActivityNewGame ......

这是我尝试过的方式

这是我的 ActivityPlayers.java 方法。当用户向 mNamelist 添加新名称时,将调用此方法。

private void addItem(int position) {
    /** Get user input (name) **/
    textAdd = findViewById(R.id.name_input);

    /** Add name to the list **/
    mNameList.add(position, new NameItem(textAdd.getText().toString().trim()));

    /** sort that list **/
    sortArrayList();

    /** save changes to shared preferences **/
    saveData();

    /** Show changed list to user **/
    mAdapter.notifyItemInserted(position);

    /** Clear the input field **/
    textAdd.getText().clear();

    /** Send namelist to ActivitynewGame **/
    Intent i = new Intent(ActivityPlayers.this, ActivityNewGame.class);
    i.putExtra("PlayerList", mNameList);
    startActivity(i);
}

这是我的 savedata() 方法,用于保存用户对 ActivityPlayers 中的名称列表所做的更改:

private void saveData() {
    SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Gson gson = new Gson();
    String json = gson.toJson(mNameList);
    editor.putString("task list", json);
    editor.apply();
}

这是我的 ActivityNewGame:

public class ActivityNewGame extends AppCompatActivity {
    private ArrayList<NewGamePlayerItem> mPlayerList;

    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

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

        mPlayerList = new ArrayList<>();
        Intent intent = getIntent();
        ArrayList<NameItem> mNameList = (ArrayList<NameItem>) intent.getSerializableExtra("PlayerList");

        /** Check if mNameList has any items in it. **/
        if (mNameList.size() != 0) {
        /** Loop through that arraylist and set its names into this Activity items. ("true" is for checkbox that this item has.) **/
            for (int i = 0; i < mNameList.size(); i++) {
                mPlayerList.add(new NewGamePlayerItem(true, mNameList.get(i).getText1()));
            }
        }

        buildRecyclerView();
    }

这里的问题是我不想访问 ActivityNewGame,我只想从 ActivityPlayers 传递那个名单,当用户选择去制作一个新游戏(ActivityNewGame)时,那个玩家名单就会在那里。那么我应该做些什么不同的事情来做到这一点呢?

如果你有想法,请给我一些想法的例子,谢谢。

标签: javaandroid

解决方案


在 ActivityPlayers.java addItem() 方法中,将数据保存在共享首选项中。

private void addItem(int position) {
    /** Get user input (name) **/
    textAdd = findViewById(R.id.name_input);

    /** Add name to the list **/
    mNameList.add(position, new NameItem(textAdd.getText().toString().trim()));

    /** sort that list **/
    sortArrayList();

    /** save changes to shared preferences **/
    saveData();

    /** Show changed list to user **/
    mAdapter.notifyItemInserted(position);

    /** Clear the input field **/
    textAdd.getText().clear();

    /** save data to shared pref **/
    SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
  Editor editor = prefs.edit();
  try {
    editor.putString(<KEY_NAME>, ObjectSerializer.serialize(mNameList));
  } catch (IOException e) {
    e.printStackTrace();
  }
  editor.commit();
}

并在 ActivityNewGame.java 中像这样从共享首选项中提取 ArrayList。

mNewNameList = new ArrayList<NewGamePlayerItem>();
 // load NewGamePlayerItems from preference
  SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);

  try {
    mNewNameList = (ArrayList<NewGamePlayerItem>) ObjectSerializer.deserialize(prefs.getString(<KEY_NAME>, ObjectSerializer.serialize(new ArrayList<NewGamePlayerItem>())));
  } catch (IOException e) {
    e.printStackTrace();
  } catch (ClassNotFoundException e) {
    e.printStackTrace();
  }

推荐阅读