2017-07-03 104 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活動中保留同一個實例。