Мое приложение аварийно завершает работу после добавления или удаления элемента во второй раз. Я создал новый вид деятельности для добавления и удаления. Я довольно новичок в Android Studio, поэтому многое из этого сбивает меня с толку, и я потратил целый день, пытаясь понять это, но заранее благодарю тех, кто будет терпелив, чтобы помочь!
Это моя основная деятельность
public class MainActivity extends AppCompatActivity {
DbHelper helper = null;
public static final String KEY = "ITEM";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final ListView listView = findViewById(R.id.list);
helper = new DbHelper(this);
final SQLiteDatabase db = helper.getReadableDatabase();
final ArrayList<String> values = new ArrayList<>();
Cursor c = helper.getAllItems(db);
while (c.moveToNext()){
values.add(c.getString(c.getColumnIndexOrThrow(ShoppingList.ItemEntity.COLUMN_NAME_ITEM)));
}
final MyArrayAdapter adapter = new MyArrayAdapter(this, R.layout.item_layout, values);
listView.setAdapter(adapter);
c.close();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String item = parent.getItemAtPosition(position).toString();
Intent intent = new Intent(parent.getContext(), ItemActivity.class);
intent.putExtra(KEY, item);
startActivity(intent);
}
});
//Defined floating action button function
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(view.getContext(), AddItemActivity.class);
startActivityForResult(i, 1);
}
});
}
Это моя AddItemActivity
public class AddItemActivity extends AppCompatActivity {
DbHelper helper = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_item);
helper = new DbHelper(this);
final SQLiteDatabase db = helper.getReadableDatabase();
Button btn = findViewById(R.id.btn_add);
final EditText item = findViewById(R.id.item_to_add);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String toAddItem = item.getText().toString();
long id = helper.insert(db, toAddItem);
Toast.makeText(view.getContext(), "Item added with id = " + id, Toast.LENGTH_LONG).show();
item.setText("");
Intent i = new Intent();
((Activity)view.getContext()).setResult(Activity.RESULT_OK, i);
finish();
}
});
}
}
Это моя ItemActivity, где срабатывает кнопка удаления
public class ItemActivity extends AppCompatActivity {
DbHelper helper = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_item);
//Database declaration
helper = new DbHelper(this);
final SQLiteDatabase db = helper.getReadableDatabase();
final TextView txt = findViewById(R.id.shop_item);
final String item = getIntent().getExtras().getString(MainActivity.KEY, "NO DATA");
txt.setText(item);
Button btn = findViewById(R.id.btn_delete);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
helper.delete(db, item);
finish();
}
});
}
}
Наконец, это мой помощник базы данных, вна тот случай, если понадобится лучше контролировать проблему.
public class DbHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "shoppingItems.db";
public DbHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(ShoppingList.ItemEntity.SQL_CREATE);
Log.d("DATABASE", "Database created");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(ShoppingList.ItemEntity.SQL_DROP);
Log.d("DATABASE", "Database dropped");
onCreate(db);
}
public long insert(SQLiteDatabase db, String word){
ContentValues values = new ContentValues();
//we're adding an item into our column word
values.put(ShoppingList.ItemEntity.COLUMN_NAME_ITEM, word);
return db.insert(ShoppingList.ItemEntity.TABLE_NAME, null, values);
}
public Cursor getAllItems(SQLiteDatabase db){
String[] projection = {
ShoppingList.ItemEntity._ID,
ShoppingList.ItemEntity.COLUMN_NAME_ITEM
};
return db.query(ShoppingList.ItemEntity.TABLE_NAME, projection, null, null, null,
null, null);
};
public void delete(SQLiteDatabase db, String item){
db.delete(ShoppingList.ItemEntity.TABLE_NAME,"item=?",new String[]{item});
}
}
Я пытался добавить notify();
после добавления и удаления метода, но в итоге получилось сообщение об ошибке «объект не заблокирован потоком перед notify ()".
Я полагаю, что должен сообщить адаптеру, что изменения были сделаны, но я не могу понять, как.
Спасибо!