问题描述
我已经开始创建一个简单的应用程序,其中一个活动具有用于添加玩家的 RecyclerView。一开始我将所有数据存储为变量,RecyclerView 的数据列表也存储为列表,一切正常。然后我尝试用 sqlite 替换变量用法并发现了问题。当我打开这个活动时,所有留在 sqlite 数据库中的玩家都会显示出来,在我按下一个按钮删除它们后,它们从视图和数据库中成功删除。凉爽的!但是当我尝试添加玩家时,记录会出现在 DB 中,但 UI 中没有任何变化。
部分活动代码:
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()
(和其他通知方法),但没有帮助。
有大佬知道怎么解决吗?
解决方法
你必须在插入后查询你的数据库
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();
}
});