如何在android中恢复包裹列表

如何在android中恢复包裹列表,android,parcel,Android,Parcel,我有一个应用程序,在活动中创建一个玩家列表,并在列表视图中显示他们。当我创建一个播放器时,我使用populatePlayerList方法,效果很好。但是,当我将列表保存在一个包中并尝试恢复它时,它不会填充listview。我不明白为什么会这样。下面是一些代码: public class PlayerManager extends AppCompatActivity { EditText playerName, playerNumber, playerPosition;

我有一个应用程序,在活动中创建一个玩家列表,并在列表视图中显示他们。当我创建一个播放器时,我使用populatePlayerList方法,效果很好。但是,当我将列表保存在一个包中并尝试恢复它时,它不会填充listview。我不明白为什么会这样。下面是一些代码:

public class PlayerManager extends AppCompatActivity {

            EditText playerName, playerNumber, playerPosition;
            ArrayList<Player> players = new ArrayList<Player>();
            ListView playerListView;


            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                setContentView(R.layout.activity_player_manager);

                playerName = (EditText) findViewById(R.id.etPlayerName);
                playerNumber = (EditText) findViewById(R.id.etPlayerNumber);
                playerPosition = (EditText) findViewById(R.id.etPlayerPosition);
                playerListView = (ListView) findViewById(R.id.playerList);

                if(savedInstanceState!=null){
                    players = savedInstanceState.getParcelableArrayList("savedList");
                    populatePlayerList();
                }

                final Button addPlayerBtn = (Button) findViewById(R.id.bAddPlayer);

                addPlayerBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        addPlayer(playerName.getText().toString(), playerNumber.getText().toString(), playerPosition.getText().toString());
                        populatePlayerList();
                        Toast.makeText(getApplicationContext(), playerName.getText().toString() + " added!", Toast.LENGTH_SHORT).show();
                    }
                });          

            private void populatePlayerList(){
                ArrayAdapter<Player> adapter = new PlayerListAdapter();
                playerListView.setAdapter(adapter);
            }

            private void addPlayer(String name, String number, String position){
                players.add(new Player(name, number, position));
        }

        private class PlayerListAdapter extends ArrayAdapter<Player> {
                public PlayerListAdapter(){
                    super(PlayerManager.this, R.layout.player_list, players);
                }

                @Override
                public View getView(int position, View view, ViewGroup parent){
                    if (view == null)
                        view = getLayoutInflater().inflate(R.layout.player_list, parent, false);

                    Player currentPlayer = players.get(position);

                    TextView name = (TextView) view.findViewById(R.id.playerName);
                    name.setText(currentPlayer.get_name());
                    TextView number = (TextView) view.findViewById(R.id.playerNumber);
                    number.setText(currentPlayer.get_number());
                    TextView playerPosition = (TextView) view.findViewById(R.id.playerPosition);
                    playerPosition.setText(currentPlayer.get_position());

                    return view;
                }
            }

    @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putParcelableArrayList("savedList", players);
        }
公共类PlayerManager扩展AppCompative活动{
编辑文本playerName、playerNumber、playerPosition;
ArrayList players=新的ArrayList();
ListView播放器ListView;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u player\u manager);
playerName=(EditText)findViewById(R.id.etPlayerName);
playerNumber=(EditText)findViewById(R.id.etPlayerNumber);
playerPosition=(EditText)findViewById(R.id.etPlayerPosition);
playerListView=(ListView)findViewById(R.id.playerList);
如果(savedInstanceState!=null){
players=savedInstanceState.getParcelableArrayList(“savedList”);
populatePlayerList();
}
最终按钮addPlayerBtn=(按钮)findViewById(R.id.bAddPlayer);
addPlayerBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
addPlayer(playerName.getText().toString(),playerNumber.getText().toString(),playerPosition.getText().toString());
populatePlayerList();
Toast.makeText(getApplicationContext(),playerName.getText().toString()+“添加!”,Toast.LENGTH\u SHORT.show();
}
});          
私有void populatePlayerList(){
ArrayAdapter=新的PlayerListAdapter();
playerListView.setAdapter(适配器);
}
私有void addPlayer(字符串名称、字符串编号、字符串位置){
玩家。添加(新玩家(姓名、号码、位置));
}
私有类PlayerListAdapter扩展了ArrayAdapter{
公共PlayerListAdapter(){
super(PlayerManager.this,R.layout.player\u列表,players);
}
@凌驾
公共视图getView(内部位置、视图视图、视图组父视图){
如果(视图==null)
view=GetLayoutFlater().充气(R.layout.player\u列表,父项,false);
Player currentPlayer=players.get(位置);
TextView name=(TextView)view.findViewById(R.id.playerName);
name.setText(currentPlayer.get_name());
TextView编号=(TextView)view.findViewById(R.id.playerNumber);
number.setText(currentPlayer.get_number());
TextView播放位置=(TextView)view.findViewById(R.id.playerPosition);
playerPosition.setText(currentPlayer.get_position());
返回视图;
}
}
@凌驾
SaveInstanceState上受保护的无效(束超出状态){
super.onSaveInstanceState(超出状态);
outState.putParcelableArrayList(“保存列表”,玩家);
}
这是我的玩家课程:

public class Player implements Parcelable{

    private String name, position,number;

    public Player (String name, String number, String position) {
        this.name = name;
        this.number = number;
        this.position = position;
    }

    protected Player(Parcel in) {
        name = in.readString();
        position = in.readString();
        number = in.readString();
    }

    public static final Parcelable.Creator<Player> CREATOR = new Parcelable.Creator<Player>() {
        @Override
        public Player createFromParcel(Parcel in) {
            return new Player(in);
        }

        @Override
        public Player[] newArray(int size) {
            return new Player[size];
        }
    };


    public String get_name() {
        return name;
    }

    public String get_position() {
        return position;
    }

    public String get_number(){
        return number;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(position);
        dest.writeString(number);
    }
}
公共类播放器实现可包裹{
私有字符串名称、位置、编号;
公共播放器(字符串名称、字符串编号、字符串位置){
this.name=名称;
这个数字=数字;
这个位置=位置;
}
受保护玩家(包裹中){
name=in.readString();
position=in.readString();
number=in.readString();
}
public static final Parcelable.Creator=新建Parcelable.Creator(){
@凌驾
公共播放器createFromParcel(包裹中){
返回新玩家(中);
}
@凌驾
公共播放器[]新数组(整数大小){
返回新玩家[大小];
}
};
公共字符串get_name(){
返回名称;
}
公共字符串get_position(){
返回位置;
}
公共字符串get_number(){
返回号码;
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地书面记录(名称);
目的地记录(位置);
目的地记录(编号);
}
}

当我尝试还原玩家列表时,我检查了它,它是空的。所以我猜它从未保存在outState中。知道为什么吗?

我通过添加android:launchMode=“singleInstance”修复了我的问题在Android Manifest.xml文件中的PlayerManager活动中。我重写onBackPressed以将我发送回以前的活动,因此不会调用onDestroy方法。这样,我就可以在PlayerManager活动中保留相同的实例。

我通过添加Android:launchMode=“singleInstance”修复了我的问题在Android Manifest.xml文件中的PlayerManager活动中。我重写onBackPressed以将我发送回以前的活动,这样就不会调用onDestroy方法。这样,我就可以在PlayerManager活动中保留相同的实例。

只是为了确定,一旦尝试恢复,是否检查列表中是否有玩家?是的,何时我创建的播放器我可以在列表视图中看到它们,但是当我转到另一个活动并返回到此列表时,我的意思是,在这里输入代码:if(savedInstanceState!=null){players=savedInstanceState.getParcelableArrayList(“savedList”);populatePlayerList();}你说得对,利奥!列表一开始很好,但当我试图恢复它时,它是空的。所以我猜outState.putParc有问题