Android RecyclerView 不处理 SQLite 更改

问题描述

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...