我正在制作一个飞盘记录器并拥有ArrayList
个Team
个对象。每个Team
都有ArrayList
个Player
个对象。所有内容都使用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);
}
答案 0 :(得分:0)
在您的情况下,您可以使用startActivityForResult
代替startActivity
,然后从Team
获取已修改的onActivityResult(int requestCode, int resultCode, Intent data)
对象以更新您的列表。
startActivityForResult example
答案 1 :(得分:0)
正如@Kingfisher Phuoc所提到的,你可以使用srartActivityForResult以防万一你不想改变你的方法。否则我会使用其中任何一个:
答案 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>";
}
});
}
中的列表,并通过接口将其引用传递给MainActivity
和ShowListFragment
。你也可以对它们进行其他操作。如果您不想使用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 正确的数据路由。
选项:
一般情况下,您可以使用服务和存储库对所有这些进行抽象,这使您可以使用诸如3. 4.和5.之类的底层测试选项,并找到最佳解决方案,此外,还可以使访问代码变得简单干净。