#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 есть свои собственные лаги… В любом случае, большое вам спасибо!