Android RecyclerView не обрабатывает изменения SQLite

#android #android-recyclerview #android-sqlite #android-adapter

#Android #android-recyclerview #android-sqlite #android-адаптер

Вопрос:

Я начал создавать простое приложение, в котором в одном из действий есть RecyclerView для добавления игроков. Вначале я хранил все данные как переменные, а список данных для RecyclerView также сохранялся как список, и все работало нормально. Затем я попытался заменить использование переменных на SQLite и обнаружил проблему. Когда я открываю это действие, отображаются все игроки, оставшиеся в базе данных SQLite, и после того, как я нажимаю кнопку, чтобы удалить их, они успешно удаляются из просмотра и из базы данных. Круто! Но когда я пытаюсь добавить проигрыватель, запись появляется в базе данных, но в пользовательском интерфейсе ничего не меняется.

Часть кода действия:

 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:

 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() (и другие методы уведомления) после вставки данных в БД, но это не помогло.
Кто-нибудь знает, как это решить?

Ответ №1:

Вы должны запросить свою базу данных после вставки

 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();
  }
});
 

Комментарии:

1. Означает ли это, что мне нужно будет всегда хранить переменную копию списка игроков, и простого вызова db.getAllPlayers() недостаточно?

2. И я пытался его использовать — проблема все та же, так что это не помогло

3. Забавно, но теперь у меня это работает… Вероятно, ваше решение сработало, но у Android Studio есть свои собственные лаги… В любом случае, большое вам спасибо!