2016-04-06 4 views
0

Ich habe eine Liste, die ich auch Spieler hinzufügen und die Spielernamen basieren auf der Größe der Liste. Wenn ich die Player-Liste zum ersten Mal einstelle, sind die Namen korrekt, aber wenn ich einen neuen Player zur Liste hinzufüge, ist der Name falsch. Bitte helfen Sie unten ist der entsprechende Code.Mein textView erhält nicht den richtigen Wert von list.size(), warum nicht?

Die Methode, die die Spieler auf der Liste ergänzt:

public static void addNewPlayers(List<Player> playerArrayList, SharedPreferences sharedPreferences, 
           PlayerScoreCardAdapter playerScoreCardAdapter, 
           int numberOfPlayersToAdd) { 

    for (int i = 0; i < numberOfPlayersToAdd; i++) { 

     // TODO: 2016-03-19 Fix player name not updating 
     String name = String.format("%s%s", 
       Keys.KEY_DEFAULT_PLAYER_NAME, playerArrayList.size() + 1); 

     Player player = new Player(name, 
       sharedPreferences.getInt(Keys.KEY_PLAYER_SCORE + String.valueOf(i + 1), 
         Keys.KEY_DEFAULT_PLAYER_SCORE)); 

     playerArrayList.add(i, player); 
     playerScoreCardAdapter.notifyItemInserted(playerArrayList.size()); 
    } 
} 

Die RecylcerView.Adapter:

public class PlayerScoreCardAdapter extends RecyclerView.Adapter<PlayerScoreCardAdapter.ScoreViewHolder> { 

private List<Player> mPlayerList; 

public PlayerScoreCardAdapter(List<Player> playerList) { 
    mPlayerList = playerList; 

} 

@Override 
public ScoreViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View view = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.player_score_list_item, parent, false); 

    return new ScoreViewHolder(view); 
} 

@Override 
public void onBindViewHolder(ScoreViewHolder holder, int position) { 

    holder.bindPlayers(mPlayerList.get(position)); 

} 

@Override 
public int getItemCount() { 
    return mPlayerList.size(); 
} 

public class ScoreViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { 

    public TextView mPlayerName; 
    public EditText mPlayerScore; 
    public Button mMinusButton, mAddButton; 

    public ScoreViewHolder(View itemView) { 
     super(itemView); 

     mPlayerName = (TextView) itemView.findViewById(R.id.textView_player_name); 
     mPlayerScore = (EditText) itemView.findViewById(R.id.editText_player_score); 
     mMinusButton = (Button) itemView.findViewById(R.id.button_minus); 
     mAddButton = (Button) itemView.findViewById(R.id.button_add); 

     mMinusButton.setOnClickListener(this); 
     mAddButton.setOnClickListener(this); 

     mPlayerName.setOnLongClickListener(this); 


    } 

    /** 
    * Binds the data from the player to the appropriate views. 
    * 
    * @param player The player data to be bound. 
    */ 
    public void bindPlayers(Player player) { 

     mPlayerName.setText(player.getName()); 
     mPlayerScore.setText(String.valueOf(player.getScore())); 

    } 

    @Override 
    public void onClick(View v) { 

     int id = v.getId(); 
     int updatedScoreCount = mPlayerList.get(getAdapterPosition()).getScore(); 

     switch (id) { 
      case R.id.button_minus: 
       updatedScoreCount--; 
       if (updatedScoreCount < 0) { 
        Toast.makeText(itemView.getContext(), R.string.toast_text_score_to_low, Toast.LENGTH_LONG).show(); 
        return; 
       } else { 
        updatePlayerScore(updatedScoreCount); 
        notifyItemChanged(getAdapterPosition()); 
       } 
       break; 
      case R.id.button_add: 
       updatedScoreCount++; 
       if (updatedScoreCount >= 9999) { 
        Toast.makeText(itemView.getContext(), R.string.toast_text_score_to_high, Toast.LENGTH_LONG).show(); 
        return; 
       } else { 
        updatePlayerScore(updatedScoreCount); 
        notifyItemChanged(getAdapterPosition()); 
       } 
       break; 
      default: 
     } 

    } 

    @Override 
    public boolean onLongClick(View v) { 
     removePlayer(getAdapterPosition()); 
     return true; 
    } 

    public void removePlayer(int positionInArrayList) { 
     mPlayerList.remove(positionInArrayList); 
     notifyItemRemoved(positionInArrayList); 

    } 

    private void updatePlayerScore(int updatedScoreCount) { 
     mPlayerList.get(getAdapterPosition()).setScore(updatedScoreCount); 
    } 
} 

}

Die Basis Anzahl der Spieler in der Liste als zwei beginnt und ihre Namen Als Spieler 1 und Spieler 2 erscheinen. Aber wenn 1 in numberOfPlayers in addNewPlayers übergeben wird, erscheinen die Spieler alle als Spieler 2.

Screenshots der Liste vor und nach addNewPlayer().

enter image description here enter image description here

+1

In dem oben dargestellten Szenario würde die Liste idealerweise so aussehen: ["Player 1", "Player 2", "Player 3"]? – RScottCarson

+0

Verwenden Sie 'adapter.notifyDataSetChanged()' anstelle von 'notifyItemInserted' –

+0

Ich habe Screenshots des betreffenden Verhaltens gepostet. Und 'notifyDataSetChanged()' soll als letztes Szenario verwendet werden. Außerdem hat es keinen Einfluss auf meine Textansicht. – Eric

Antwort

0

versuchen Sie dies: die getItemCount im Adapter überschreiben Sie die Größe der Liste zu reflektieren es verwendet, und diese Methode aufrufen, anstatt die Anzahl der Elemente in Ihrer Liste zu bekommen.

+0

Ich habe das versucht und es gibt keine Änderung im Verhalten. – Eric

0

Das Problem war, dass ich den neuen Player am Anfang der Liste und nicht am Ende der Liste hinzugefügt habe. Um ehrlich zu sein, ich bin mir sicher, warum das funktioniert hat, aber es funktioniert. Der neue Code sieht so aus.

public static void addNewPlayers(List<Player> playerArrayList, SharedPreferences sharedPreferences, 
           PlayerScoreCardAdapter playerScoreCardAdapter, 
           int numberOfPlayersToAdd) { 

    for (int i = 0; i < numberOfPlayersToAdd; i++) { 

     String name = String.format("%s%s", Keys.KEY_DEFAULT_PLAYER_NAME, playerArrayList.size() + 1); 

     Player player = new Player(name, sharedPreferences.getInt(Keys.KEY_PLAYER_SCORE + String.valueOf(i + 1), 
       Keys.KEY_DEFAULT_PLAYER_SCORE)); 

     playerArrayList.add(playerArrayList.size(), player); 
     playerScoreCardAdapter.notifyItemInserted(playerArrayList.size()); 
    } 
}