将项目添加或删除到数据库后,如何更新列表视图或通知适配器?

第二次添加或删除项目后,我的应用程序崩溃。我创建了一个用于添加和删除的新活动。我是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()之前未被线程锁定”。

我相信我应该让适配器知道更改已完成,但是我不知道如何更改。

谢谢!

xuguirong 回答:将项目添加或删除到数据库后,如何更新列表视图或通知适配器?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3136667.html

大家都在问