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()
.
In dem oben dargestellten Szenario würde die Liste idealerweise so aussehen: ["Player 1", "Player 2", "Player 3"]? – RScottCarson
Verwenden Sie 'adapter.notifyDataSetChanged()' anstelle von 'notifyItemInserted' –
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