第二次添加或删除项目后,我的应用程序崩溃。我创建了一个用于添加和删除的新活动。我是Android Studio的新手,所以很多事情让我感到困惑,花了整整一天的时间来弄清楚它,但是在此先感谢那些耐心帮助的人!
这是我的Mainactivity
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,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);
};
public void delete(SQLiteDatabase db,String item){
db.delete(ShoppingList.ItemEntity.TABLE_NAME,"item=?",new String[]{item});
}
}
我尝试在添加和删除方法之后添加notify();
,但最终出现错误“对象在notify()之前未被线程锁定”。
我相信我应该让适配器知道更改已完成,但是我不知道如何更改。
谢谢!