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();
}
});
我已经开始创建一个简单的应用程序,其中一个活动具有用于添加玩家的 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();
}
});