2017-07-03 112 views
1

可parcelable列表我有这个应用程序,在一个活动创建一个球员列表,并在列表视图中显示它们。当我创建一个播放器时,我使用populatePlayerList方法,它工作正常。但是,当我将这个列表保存在一个包中并尝试恢复它时,它不会填充列表视图。无法弄清楚为什么会发生这种情况。下面是一些代码:我怎样才能恢复在android

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); 
     } 

这里是我的播放器类:

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); 
    } 
} 

我查了球员名单时,我试图恢复它和它的空。所以我想它从来没有保存在outState。任何想法为什么?

+0

可以肯定的是,一旦你试图恢复它,你是否检查列表中有玩家? – leobelizquierdo

+0

yeap,当我创建玩家我可以在列表视图中看到他们,但是当我去到另一个活动并返回到这个列表不见了 – Nale

+0

我的意思是,代码在这里输入:if(savedInstanceState!= null){ = savedInstanceState.getParcelableArrayList(“savedList”); populatePlayerList(); }? – leobelizquierdo

回答

0

我通过在Android Manifest.xml文件的PlayerManager活动中添加了android:launchMode =“singleInstance”来解决了我的问题。我重写了onBackPressed以将我返回到之前的活动,因此不调用onDestroy方法。这样我就可以在PlayerManager活动中保留同一个实例。