编辑和保存ArrayList<>已经传递给另一个活动

时间:2016-11-20 03:07:32

标签: java android

我正在制作一个飞盘记录器并拥有ArrayListTeam个对象。每个Team都有ArrayListPlayer个对象。所有内容都使用Serializable正确使用Intent

在我的主要活动中,我在Team中显示ListView个对象的列表,并添加另一个Team的选项(只需要一个名称)。选择Team后,我会使用Intent将对象传递给另一个活动。在第二个活动中,我让它显示Player个对象的列表,并有字段将另一个玩家对象输入到传递的列表中。

当我返回主要活动并返回添加Player活动时,我添加的内容已消失。

我无法使用static,因为显然有多个Team个对象。我认为传回已更改的ArrayList可能会有效,但这看起来有点蹩脚,耗时且令人沮丧。

Android Studio中是否有内置方式可以执行此操作,还是我自己使用?

注意:我没有按照评论中的建议使用SQLite

在这方面没有很多东西要展示,但我想这就是:

MainActivity.java

private static ArrayList<Team> listOfTeams = new ArrayList<>();
private static ArrayList<Game> listOfGames = new ArrayList<>();
private ListView gameList, teamList;

.....

teamList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Team t = (Team)teamList.getItemAtPosition(position);
        viewTeam(t);
    }
});

.....

//Item select in teamList. Start the TeamViewActivity
public void viewTeam(Team t)
{
    Intent i = new Intent(this, TeamViewActivity.class);
    i.putExtra("teamView",t);
    startActivity(i);
}

TeamViewActivity.java

private Team team;
private ListView rosterList;

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

    rosterList = (ListView) findViewById(R.id.playerList);

    Intent i = getIntent();
    Bundle extras = i.getExtras();

    if(extras!=null)
    {
        if(extras.get("teamView")!=null)
        {
            team = (Team) extras.get("teamView");
        }
    }

    populateRosterList(team.getRoster());
}

public void addPlayerToRoster(View view)
{
    String checkFirst = ((EditText) findViewById(R.id.firstText)).getText().toString();
    String checkLast = ((EditText) findViewById(R.id.lastText)).getText().toString();
    String checkNumber = ((EditText) findViewById(R.id.numberText)).getText().toString();

    if(!checkNumber.equals(""))
    {
        team.addPlayer(checkFirst, checkLast, Integer.parseInt(checkNumber));

        ((EditText) findViewById(R.id.firstText)).setText("");
        ((EditText) findViewById(R.id.lastText)).setText("");
        ((EditText) findViewById(R.id.numberText)).setText("");

        populateRosterList(team.getRoster());
    }
}

public void returnToMain(View view)
{
    Intent i = new Intent(this, MainActivity.class);
    i.putExtra("teamView", team);
    startActivity(i);
}

private void populateRosterList(ArrayList<Player> list)
{
    ArrayAdapter<Player> adapter = new ArrayAdapter<>(this,
            R.layout.activity_list, R.id.genericText, list);
    rosterList.setAdapter(adapter);
}

4 个答案:

答案 0 :(得分:0)

在您的情况下,您可以使用startActivityForResult代替startActivity,然后从Team获取已修改的onActivityResult(int requestCode, int resultCode, Intent data)对象以更新您的列表。 startActivityForResult example

答案 1 :(得分:0)

正如@Kingfisher Phuoc所提到的,你可以使用srartActivityForResult以防万一你不想改变你的方法。否则我会使用其中任何一个:

  1. SharedPreference存储你的arraylist对象(通过将arraylist转换为json然后将其存储为json格式的字符串)。在PlayerActivity中,您可以退出数据,对其进行操作然后保存。见this post
  2. SQlite的

答案 2 :(得分:0)

您可以使用片段。您保留public function boot() { Blade::directive('showIfError', function($fieldName) { $errors = session()->get('errors'); if ($errors->has($fieldName)) { echo "<span class='help-block'> <strong>". $errors->first($fieldName). "</strong> </span>"; } }); } 中的列表,并通过接口将其引用传递给MainActivityShowListFragment。你也可以对它们进行其他操作。如果您不想使用json或sqlite,它可能是一个很好的方式。

<强> MainActivity.java

AddPlayerFragment

<强> ShowListFragment.java

public class MainActivity extends Activity implements ShowListener{
   public interface ShowListener{
       ArrayList<Team> getTeamList();
   }

   private ArrayList<Team> listOfTeams = new ArrayList<>();

   @Override
   public ArrayList<Team> getTeamList() {
    return listOfTeams;
   }

}

答案 3 :(得分:0)

考虑您的概念:

您序列化对象,即将其转换为可转移格式,然后将复制转换为其他活动,并重新构建为实例。

因此,如果不返回,则更改另一个在上一个活动中不可用的实例 - 再次,序列化 - 最后重新构建并将其复制回相应的实例。

您需要的是应用程序中的共享内存存储,它可以使用具有ISerializable的Intents来更改和检索数据交叉活动 OR 正确的数据路由。

选项:

  1. 始终序列化对象并传递和复制它们。 - &GT;没有多线程的改动,可能很慢,不美观
  2. 具有全局数据存储的单例应用程序和上下文对象(我不推荐由于内存管理和垃圾 在活动开关之间收集但是为了一致性I&#39; d 想提一下这个选项)
  3. SQLite3的 - &GT;快速,简单和可扩展,但开始使用
  4. 有点麻烦
  5. 在数据文件夹中存储和维护的任何其他文件结构 - &GT;我在这里期待很多样板代码和低性能
  6. Webservice和远程数据库
  7. 正确的组件设置,即使用例如片段对数据结构的适当引用初始化软件中的所有访问组件(感谢@mismanc,我实际上最初错过了该选项)
  8. 一般情况下,您可以使用服务和存储库对所有这些进行抽象,这使您可以使用诸如3. 4.和5.之类的底层测试选项,并找到最佳解决方案,此外,还可以使访问代码变得简单干净。