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

Posted

技术标签:

【中文标题】编辑和保存已传递给另一个活动的 ArrayList<>【英文标题】:Editing and saving an ArrayList<> that has been passed to another activity 【发布时间】:2017-04-03 16:10:36 【问题描述】:

我正在制作一个飞盘记录器,并且有一个 ArrayListTeam 对象。每个Team 都有一个ArrayListPlayer 对象。一切都使用Serializable 正确发送使用Intent

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

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

我不能使用static,因为显然有不止一个Team 对象。我认为传回更改后的 ArrayList 可能会奏效,但这似乎有点蹩脚、耗时且令人沮丧。

android Studio 中是否有内置方法可以做到这一点,还是我自己做的?

注意:我没有按照 cmets 中的建议使用 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);

【问题讨论】:

你能告诉我们你的代码吗? 如果我理解正确,您可能可以使用 SQLite 【参考方案1】:

考虑你的概念:

您序列化一个对象,即将其转换为可传输的格式,然后将其复制到其他活动并重建为一个实例。

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

您需要的是应用程序中的共享内存存储,它可以更改和检索数据交叉活动使用带 ISerializable 的 Intents 进行适当的数据路由。

选项:

    始终序列化对象并传递和复制它们。 -> 没有多线程修改,可能很慢,不美观 具有全局数据存储 ir 上下文对象的单例应用程序(由于内存管理和垃圾,我不推荐使用 活动开关之间的收集但为了保持一致,我会 想提一下这个选项) SQLite3 -> 快速、简单且可扩展,但入门有点麻烦 在数据文件夹中存储和维护的任何其他文件结构 -> 我希望这里有很多样板代码,而且性能低下 Web 服务和远程数据库 正确的组件设置,即使用例如片段对数据结构的适当引用来初始化软件中的所有访问组件(感谢@mismanc,我最初实际上错过了该选项)

一般而言,您可以使用服务和存储库将所有这些抽象出来,这样您就可以在底层测试选项,例如 3. 4. 和 5. 并找到您的最佳解决方案,此外,还可以让访问代码保持简单干净。

【讨论】:

使用 RealmDB、SQLBrite 或其他 sqlite 库使 Sqlite 选项不那么繁琐 感谢整个选项列表!我想我可能不得不去研究 SQLite。我以前见过它,但我自己并没有真正使用过。一些并发将是一个很好的补充,所以我不妨去它 请考虑@cricket_007 集成Sqlite 的建议!【参考方案2】:

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

【讨论】:

【参考方案3】:

您可以使用片段。您将列表保存在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();
    


【讨论】:

【参考方案4】:

正如@Kingfisher Phuoc 所说,如果您不想改变方法,可以使用 srartActivityForResult。

否则我会建议你使用:

    SharedPreference 来存储您的 arraylist 对象(通过将 arraylist 转换为 json 然后将其存储为 json 格式的字符串)。在 PlayerActivity 中,您检索数据,对其进行操作然后保存。见this post

    SQLite

【讨论】:

以上是关于编辑和保存已传递给另一个活动的 ArrayList<>的主要内容,如果未能解决你的问题,请参考以下文章

通过 Intent 传递 ArrayList

如何将价值从 recyclerview 项目传递到另一个活动

将 ArrayList 的 ArrayList 传递给另一个类

如何将数组传递给另一个活动?

将arraylist传递给另一个类以检查可用性及其过期日期的方法

无法通过intent将数组列表从一个活动传递到另一个活动