Android RecyclerView 未处理 SQLite 更改

Android RecyclerView is not handling SQLite changes

我已经开始创建一个简单的应用程序,其中一个活动具有用于添加玩家的 RecyclerView。一开始我将所有数据存储为变量,RecyclerView 的数据列表也存储为 List 并且一切正常。然后我尝试用 SQLite 替换变量用法并发现了问题。当我打开这个 activity 时,SQLite DB 中剩余的所有玩家都会显示出来,在我按下按钮删除它们之后,它们会从视图和数据库中成功删除。凉爽的!但是当我尝试添加播放器时,记录出现在数据库中,但 UI.

中没有任何变化

部分activity代码:

public class SetupActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    PlayerAdapter adapter;

    PlayersDbHelper db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setup);

        ImageButton button = findViewById(R.id.button);
        nameInput = findViewById(R.id.nameInput);

        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        db = new PlayersDbHelper(this);

        button.setOnClickListener(view -> {
            String name = Objects.requireNonNull(nameInput.getText()).toString().trim();
            db.insertPlayer(name);
        });

        adapter = new PlayerAdapter(this, db.getAllPlayers());
        recyclerView.setAdapter(adapter);
    }
}

PlayerAdapter 的一部分 class:

public class PlayerAdapter extends RecyclerView.Adapter<PlayerAdapter.PlayerViewHolder> {
    Context context;
    List<Player> playerList;
    PlayersDbHelper db;

    public PlayerAdapter(Context context, List<Player> playerList) {
        this.context = context;
        this.playerList = playerList;
    }

    @NonNull
    @Override
    public PlayerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.list_layout, parent, false);
        return new PlayerViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull PlayerViewHolder holder, int position) {
        Player player = playerList.get(position);
        holder.playerName.setText(player.getName());
        holder.trashButton.setImageDrawable(ContextCompat.getDrawable(context, player.getTrash()));
        holder.position = position;
    }

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

    class PlayerViewHolder extends RecyclerView.ViewHolder {
        TextView playerName;
        ImageButton trashButton;
        int position;

        public PlayerViewHolder(@NonNull View itemView) {
            super(itemView);
            playerName = itemView.findViewById(R.id.playerName);
            trashButton = itemView.findViewById(R.id.trashButton);
            db = new PlayersDbHelper(context);

            trashButton.setOnClickListener(view -> {
                db.removePlayer(playerList.get(position));
                playerList.remove(position);

                notifyItemRemoved(position);
                notifyItemRangeChanged(position, playerList.size());
            });
        }

    }
}

和 PlayerDbHelper 的一部分:

public long insertPlayer(String name, String gender) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(PLAYERS_COLUMN_NAME, name);
    return db.insert(PLAYERS_TABLE_NAME, null, contentValues);
}

public boolean removePlayer(Player player) {
    SQLiteDatabase db = this.getWritableDatabase();
    long result = db.delete(PLAYERS_TABLE_NAME, PLAYERS_COLUMN_ID + "=" + player.getId(), null);
    return result > 0;
}

我也曾尝试在将数据插入数据库后调用 adapter.notifyDataSetChanged()(和其他通知方法),但没有帮助。 有人知道如何解决这个问题吗?

插入后必须查询数据库

playerList = db.getAllPlayers();
adapter = new PlayerAdapter(this, playerList);
recyclerView.setAdapter(adapter);
button.setOnClickListener(view -> {
  String name = Objects.requireNonNull(nameInput.getText()).toString().trim();
  long result = db.insertPlayer(name);
  if (result != -1) {
    playerList = b.getAllPlayers();
    adapter.notifyDataSetChanged();
  }
});