2016-11-20 64 views
0

我正在制作飞盘记录器并且有ArrayListTeam对象。每个Team具有Player对象的ArrayList。一切正在使用Serializable正确使用Intent发送。编辑并保存已传递给另一个活动的ArrayList <>

在我的主要活动我显示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); 
} 
+0

你能告诉我们你的代码吗? – ifly6

+0

如果我理解正确,你可能会使用SQLite –

回答

0

考虑你的概念:

您序列化一个对象,即你改造成一个可转移的格式,然后将其复制转移到其他活动和重建作为实例。

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

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

选项:

  1. 始终序列化对象和周围传递和复制。 - >无多线程改变,可能是缓慢的,unbeautiful
  2. 辛格尔顿应用全球数据存储IR语境对象(我不到期建议的内存管理和垃圾收集 其间的活动开关,但为了保持一致性我倒是 想提此选项)
  3. SQLite3的 - >快速,简单和可扩展的,但是有点麻烦上手
  4. 任何其他文件结构中存储和维护的数据文件夹 - >我期望了很多的样板代码在这里,性能低下
  5. Webservice an d远程数据库
  6. 适当组件设置,即,初始化在软件的所有访问部件与适当的参考使用例如片段的数据结构(感谢@mismanc,我实际上错过最初该选项)

在一般情况下,您可以使用服务和存储库将所有内容抽象出来,这样您就可以使用诸如3. 4.和5.之类的底层测试选项,并找到最佳解决方案,并且还可以使访问代码简单而干净。

+1

使用RealmDB,SQLBrite或其他sqlite库使得Sqlite选项不那么麻烦 –

+0

RealmDB其实很棒。感谢您指出这一点。 – MABVT

+0

感谢您的整个选项列表!我想我可能不得不去看看SQLite。我以前见过,但我自己并没有真正使用它。一些并发将是一个很好的补充,所以我不妨去它 – PurpleWatermelun

0

在你的情况下,你可以用startActivityForResult代替startActivity,然后从onActivityResult(int requestCode, int resultCode, Intent data)得到你修改的Team对象来更新你的列表。 startActivityForResult example

0

作为@Kingfisher Phuoc提到你可以使用srartActivityForResult以防万一你不想改变你的方法。否则,我会sugest你使用或者:

  1. SharedPreference要保存您的ArrayList对象(通过转换数组列表,以JSON然后将其保存为JSON格式的字符串)。在PlayerActivity中,您退出数据,操作并保存数据。看到this post
  2. SQlite的
0

您可以使用片段。您在MainActivity中保留该列表,并通过接口传递其对ShowListFragmentAddPlayerFragment的引用。你也可以对它们进行其他操作。如果你不想使用json或sqlite,它可以成为你的一个好方法。

MainActivity.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; 
    } 

} 

ShowListFragment。java的

public class ShowListFragment extends Fragment { 

private ArrayList<Team> listOfTeams; 
private ShowListener listener; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     listener = (ShowListener)getActivity(); 
     listOfTeams = listener.getTeamList(); 
    } 

} 
相关问题