Java 尝试在RecyclerView中添加新元素时,某些项会重复

Java 尝试在RecyclerView中添加新元素时,某些项会重复,java,android,android-recyclerview,Java,Android,Android Recyclerview,我已经创建了一个游戏,用户需要在“回收器”视图中输入玩家姓名才能开始游戏。 我的问题是,当我尝试添加新玩家时,每8或9名玩家,输入的名字就会重复。 我曾尝试在网上搜索原因,但未能找到解决方案,也看不出问题所在。 另外,当我修改重复的名称时,它也会在recycler视图中更改该名称的每个实例。 活动运行良好,当游戏开始时,输入的每个名字都在游戏中,没有重复 编辑:我添加了holder.playerName.getText().clear();在adapter类的onBindViewHolder中,

我已经创建了一个游戏,用户需要在“回收器”视图中输入玩家姓名才能开始游戏。
我的问题是,当我尝试添加新玩家时,每8或9名玩家,输入的名字就会重复。
我曾尝试在网上搜索原因,但未能找到解决方案,也看不出问题所在。
另外,当我修改重复的名称时,它也会在recycler视图中更改该名称的每个实例。
活动运行良好,当游戏开始时,输入的每个名字都在游戏中,没有重复

编辑:我添加了holder.playerName.getText().clear();在adapter类的onBindViewHolder中,这纠正了复制问题,但创建了另一个问题:我现在有没有提示的空EditText(其中EditText应该提示播放器号码)

编辑2:将holder.playerName.getText().clear()行放在onBindViewHolder方法的holder.playerName.setHint(players.get(position.getName())行下面就成功了! 谢谢

以下是活动的代码:

 public class PlayersNameScreen extends AppCompatActivity {

  public PlayerMenu playerMenu;                           // A PlayerMenu used to populate the screen when started
  public static PlayerMenu playerMenu1;                   // A static PlayerMenu to store all the players entered on this screen and access it on the next

  private RecyclerView listOfPlayers;                     // The recycler view where the players can see, add and enter other players
  private ListOfPlayersAdapter listOfPlayersAdapter;      // The adapter for the recycler view

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

      initializeScreen();
  }

  /**
   * Sets the contents of the screen
   */
  private void initializeScreen() {

      setContentView(R.layout.activity_players_name_screen);

      listOfPlayers = findViewById(R.id.playerNames);
      // The button used to add a player
      FloatingActionButton addPlayer = findViewById(R.id.addPlayer);

      // Start the game with the new players entered, filtering the menu as well
      // The button to start the game
      Button startGame = findViewById(R.id.Booze);
      startGame.setOnClickListener(view -> {
          playerMenu1 = new PlayerMenu();
          playerMenu1.removeAllPlayers();
          playerMenu1.addAllPlayers(playerMenu.getPlayers());
          playerMenu1.filter();
          goToCardScreen();
      });

      playerMenu = new PlayerMenu();

      // Set the default view of the list
      setListOfPlayersView(playerMenu.getPlayers());

      // Adds a row to the list and a player to the menu, scrolls to the new player entered
      addPlayer.setOnClickListener((View view) -> {
          playerMenu.addPlayer(playerMenu.size());
          listOfPlayersAdapter.notifyItemInserted(playerMenu.size() - 1);
          listOfPlayers.smoothScrollToPosition(playerMenu.size() - 1);
      });

  }

  /**
   * Creates the list of all the players (the view)
   * @param playerz the list of the players
   */
  void setListOfPlayersView(ArrayList<Player> playerz) {
      listOfPlayersAdapter = new ListOfPlayersAdapter(playerz);
      RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());

      listOfPlayers.setLayoutManager(layoutManager);
      listOfPlayers.setItemAnimator(new DefaultItemAnimator());
      listOfPlayers.setAdapter(listOfPlayersAdapter);

  }

  /**
   * Before launching the game, check that the names are correct
   */
  private void goToCardScreen() {
      Set<String> set = new HashSet<>(playerMenu1.getPlayersNames());
      boolean playersNameOK = true;
      boolean playersEntered = true;
      boolean enoughPlayers = true;

      if (set.size() < playerMenu1.getPlayers().size()) {
          // Shows a message that the player entered duplicated names
          playersNameOK = false;
      }

      if (set.isEmpty()) {
          // Shows a message saying they need to enter players
          playersEntered = false;
      }

      if (set.size() == 1) {
          // Shows a message showing that there aren't enough players
          enoughPlayers = false;
      }

      if (playersNameOK && playersEntered && enoughPlayers) {
          createWaiver(); --> eventually leads to next activity
      }
  }
}
public class PlayersNameScreen扩展appcompative活动{
public PlayerMenu PlayerMenu;//启动时用于填充屏幕的PlayerMenu
public static PlayerMenu playerMenu1;//一个静态PlayerMenu,用于存储在此屏幕上输入的所有玩家,并在下一个屏幕上访问
private RecyclerView listOfPlayers;//玩家可以在其中查看、添加和输入其他玩家的recycler视图
private ListOfPlayerAdapter ListOfPlayerAdapter;//回收器视图的适配器
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
初始化屏幕();
}
/**
*设置屏幕的内容
*/
私有void initializeScreen(){
setContentView(R.layout.activity\u players\u name\u屏幕);
listOfPlayers=findViewById(R.id.playerNames);
//用于添加播放机的按钮
FloatingActionButton addPlayer=findViewById(R.id.addPlayer);
//输入新玩家开始游戏,同时过滤菜单
//开始游戏的按钮
Button StartName=findViewById(R.id.Booze);
startName.setOnClickListener(视图->{
playerMenu1=新的PlayerMenu();
playerMenu1.移除所有玩家();
playerMenu1.addAllPlayers(playerMenu.getPlayers());
playerMenu1.filter();
goToCardScreen();
});
playerMenu=新的playerMenu();
//设置列表的默认视图
setListofPlayerView(playerMenu.getPlayers());
//在列表中添加一行,在菜单中添加一个播放机,滚动到输入的新播放机
addPlayer.setOnClickListener((视图)->{
playerMenu.addPlayer(playerMenu.size());
ListofPlayerAdapter.notifyItemInserted(playerMenu.size()-1);
listOfPlayers.smoothScrollToPosition(playerMenu.size()-1);
});
}
/**
*创建所有玩家的列表(视图)
*@param playerz玩家名单
*/
void SetListOfPlayerView(ArrayList playerz){
ListOfPlayerAdapter=新的ListOfPlayerAdapter(playerz);
RecyclerView.LayoutManager LayoutManager=新的LinearLayoutManager(getApplicationContext());
setLayoutManager(layoutManager);
setItemAnimator(新的DefaultItemAnimator());
setAdapter(ListofPlayerAdapter);
}
/**
*在启动游戏之前,请检查名称是否正确
*/
私有void goToCardScreen(){
Set Set=newhashset(playerMenu1.getPlayersNames());
布尔playersNameOK=true;
布尔playersEntered=true;
布尔值enoughPlayers=true;
if(set.size()最终导致下一个活动
}
}
}
下面是适配器的代码

 public class ListOfPlayersAdapter extends RecyclerView.Adapter<ListOfPlayersAdapter.MyViewHolder>{

  private ArrayList<Player> players; // The array to old every player entered

  @NonNull
  @Override
  public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
      View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.player_name_row, parent, false);
      return new MyViewHolder(itemView);
  }

  @Override
  public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
      int x = holder.getLayoutPosition();
      // If a real name was entered (names that don't include the string <player>), set the text of the EditText to the name of the player
      if (!players.get(x).getName().contains("Player")){
          holder.playerName.setText(players.get(x).getName());
      }
      else {
          // Keep hinting the player number (aka Player x)
          holder.playerName.setHint(players.get(position).getName());
          holder.playerName.getText().clear();
      }
  }
      @Override
  public int getItemCount() {
      return players.size();
  }

  ListOfPlayersAdapter(ArrayList<Player> players) {
      this.players = players;
  }

  class MyViewHolder extends RecyclerView.ViewHolder {

      private EditText playerName;

      MyViewHolder(View itemView) {
          super(itemView);
          playerName = itemView.findViewById(R.id.playerInput);

          playerName.addTextChangedListener(new TextWatcher() {
              @Override
              public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

              @Override
              public void onTextChanged(CharSequence s, int start, int before, int count) {
                  Player playerBis = new Player(s.toString());
                  players.set(getAdapterPosition(),playerBis);
              }

              @Override
              public void afterTextChanged(Editable s) {
              }
          });
      }
  }
 }
公共类ListofPlayerAdapter扩展了RecyclerView.Adapter{
private ArrayList players;//每个玩家输入的旧数组
@非空
@凌驾
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.player\u name\u row,parent,false);
返回新的MyViewHolder(itemView);
}
@凌驾
public void onBindViewHolder(@NonNull MyViewHolder,int位置){
int x=holder.getLayoutPosition();
//如果输入了真实姓名(不包括字符串的姓名),请将EditText的文本设置为播放机的名称
如果(!players.get(x).getName()包含(“Player”)){
holder.playerName.setText(players.get(x.getName());
}
否则{
//继续暗示玩家号码(又名玩家x)
holder.playerName.setHint(players.get(position.getName());
holder.playerName.getText().clear();
}
}
@凌驾
public int getItemCount(){
返回玩家。大小();
}
播放器适配器列表(ArrayList播放器){
这个。玩家=玩家;
}
类MyViewHolder扩展了RecyclerView.ViewHolder{
私人编辑文本播放器名称;
MyViewHolder(查看项目视图){
超级(项目视图);
playerName=itemView.findviewbyd(R.id.playernput);
playerName.addTextChangedListener(新的TextWatcher(){
@凌驾
文本之前的公共无效c
 class PlayerMenu {
  private ArrayList<Player> players; // List to store every player

  PlayerMenu() {
      // Creating and adding the players to the menu
      players = new ArrayList<>();

      Player player1 = new Player("Player 1");
      Player player2 = new Player("Player 2");
      Player player3 = new Player("Player 3");

      players.add(player1);
      players.add(player2);
      players.add(player3);
  }

  /**
   *
   * @param i The position of the player in the list
   * @return The name of the player
   */
  String getPlayer(int i) {
      return players.get(i).getName();
  }

  /**
   * Method to add a player in the menu
   */
  void addPlayer(int position){
      Player player = new Player("Player" + " " + (players.size() + 1));
      players.add(position, player);
  }

  /**
   * Method to add all players from an ArrayList to the players array list
   * @param playerz The ArrayList we want to get the players from
   */
  void addAllPlayers(ArrayList<Player> playerz) {
      players.addAll(playerz);
  }

  /**
   * Method to remove all players from the list
   */
  void removeAllPlayers() {
      players.clear();
  }

  /**
   * To see the list of players
   * @return the list of all the players
   */
  ArrayList<Player> getPlayers() {
      return players;
  }

  /**
   * Remove from the list of players all those who are nameless (aka Player i)
   */
  void filter() {
      players.removeIf(player -> player.getName().toLowerCase().contains("player")) || player.getName().isEmpty()));
  }

  /**
   * Size of the list
   * @return the size of the list of players
   */
  public int size() {
      return players.size();
  }
 }
     @Override
  public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
      int x = holder.getLayoutPosition();
      // If a real name was entered (names that don't include the string <player>), set the text of the EditText to the name of the player
      if (!players.get(x).getName().contains("Player")){
          holder.playerName.setText(players.get(x).getName());
      }
      else {
          holder.playerName.setText("")
          // Keep hinting the player number (aka Player x)
          holder.playerName.setHint(players.get(position).getName());
      }
  }