自定义适配器
public class PassAdapter extends RecyclerView.Adapter<PassViewHolder> {
Context context;
MainActivity mainActivity;
private static final Object TAG = "SQLiteDatabaseInsert";
List<LoginData> loginDataArrayList;
DatabaseHelper databaseHelper;
private LoginData loginData;
SQLiteDatabase sqLiteDatabase;
private int position;
public PassAdapter(Context context, List<LoginData> loginDataArrayList) {
this.context = context;
this.loginDataArrayList = loginDataArrayList;
}
@NonNull
@Override
public PassViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
View view = LayoutInflater.from(context.getApplicationContext()).inflate(R.layout.pass_item, viewGroup, false);
PassViewHolder holder = new PassViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull PassViewHolder holder, int position) {
holder.name_view.setText(loginDataArrayList.get(holder.getBindingAdapterPosition()).getName());
holder.login_view.setText(loginDataArrayList.get(holder.getBindingAdapterPosition()).getLogin());
holder.password_view.setText(loginDataArrayList.get(holder.getBindingAdapterPosition()).getPass());
holder.category_view.setText(loginDataArrayList.get(holder.getBindingAdapterPosition()).getCategory());
holder.menuImage.setImageResource(R.drawable.item_menu_icon);
holder.menuImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu popupMenu = new PopupMenu(context.getApplicationContext(), v);
popupMenu.getMenuInflater().inflate(R.menu.menu_items, popupMenu.getMenu());
popupMenu.show();
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
ClipboardManager clipboard = (ClipboardManager) context.getApplicationContext().getSystemService(CLIPBOARD_SERVICE);
int idMenuItem = item.getItemId();
Integer getId = loginDataArrayList.get(holder.getBindingAdapterPosition()).getId();
String loginToCopy = loginDataArrayList.get(holder.getBindingAdapterPosition()).getLogin();
if (idMenuItem == R.id.copy_login) {
// copy login
ClipData loginClip = ClipData.newPlainText("Clip", String.valueOf(getId));
clipboard.setPrimaryClip(loginClip);
return true;
} else if (idMenuItem == R.id.copy_pass) {
// copy password
return true;
} else if (idMenuItem == R.id.delete_item) {
// delete item
Log.d("DetailAdapter", "Delete item with ID: " + String.valueOf(getId));
try {
databaseHelper.deleteItemById(getId);
removeItem(holder.getBindingAdapterPosition());
}
catch(Exception error) {
Log.d("DetailAdapter", "Error with delete item(error)");
error.printStackTrace();
}
}
return true;
}
});
}
});
}
@Override
public int getItemCount() {
return loginDataArrayList.size();
}
public void removeItem(int position) {
if (position >= 0 && position < loginDataArrayList.size()) {
loginDataArrayList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, loginDataArrayList.size());
Toast.makeText(context, "Deleted...", Toast.LENGTH_SHORT).show();
}
}
}
删除项目时出现问题
Log.d("DetailAdapter", "Delete item with ID: " + String.valueOf(getId));
try {
databaseHelper.deleteItemById(getId);
removeItem(holder.getBindingAdapterPosition());
}
catch(Exception error) {
Log.d("DetailAdapter", "Error with delete item(error)");
error.printStackTrace();
}
数据库助手
public void deleteItemsByCategory(String categoryName) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_NAME, COLUMN_CATEGORY + " = ?", new String[]{categoryName});
db.close();
}
public void deleteItemById(Integer id) {
SQLiteDatabase db = this.getWritableDatabase();
int deletedRows = db.delete(TABLE_NAME, COLUMN_ID + " = ?", new String[]{String.valueOf(id)});
db.close();
if (deletedRows > 0) {
Log.d("DatabaseHelper", "Item with ID " + String.valueOf(id) + " was deleted.");
} else {
Log.d("DatabaseHelper", "No item with ID " + String.valueOf(id) + " was found.");
}
}
在调试中获取正确的ID号
Integer getId = loginDataArrayList.get(holder.getBindingAdapterPosition()).getId();
但是在调用databaseHelper.deleteItemById之后得到这个错误。 数据库中有具有正确 ID 的项目,有来自数据库的正常列表。
我不明白什么是看不见的。请帮忙。
2024-07-23 23:03:09.775 933-933 System.err com.theray.passbox W java.lang.NullPointerException: Attempt to invoke virtual method 'void com.user.passbox.DatabaseHelper.deleteItemById(java.lang.Integer)' on a null object reference
2024-07-23 23:03:09.778 933-933 System.err com.theray.passbox W at com.theray.passbox.PassAdapter$1$1.onMenuItemClick(PassAdapter.java:122)
2024-07-23 23:03:09.778 933-933 System.err com.theray.passbox W at android.widget.PopupMenu$1.onMenuItemSelected(PopupMenu.java:109)
从数据库中删除对象。 (这个应用程序想要我添加一些文本,所以我这样做了(编码太多:D) fdasjgfjswgtfrwesfbsdjuhgsdfsdjbfjugwsefruewuitfgweifhowefjpoqajfcisvuffgsdufgurguweqigruiewgru
现在工作谢谢!
databaseHelper = new DatabaseHelper(context.getApplicationContext());