4

Android OS sqlite データベースから取得したデータを表示しています。アイテムをクリックすると、削除するアイテムを正常に取得できます。ただし、操作後にリストビューを更新または更新する際に問題が発生しています。

以下は、連絡先を削除するコードです。

deleteBtn = (Button)v.findViewById(R.id.deleteBtn);
    deleteBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), "Deleted: " + c.getId() + " " + c.getName(), Toast.LENGTH_SHORT).show();
            adapter.deleteContact(c.getId());
            updateList();
        }
    });

以下は updateList() メソッドです。

public void updateList(){
    myList.refreshDrawableState();
    myList.invalidateViews();
    this.notifyDataSetChanged();
}

このメソッドには、リフレッシュしようとした 3 つの方法すべてが含まれていましたが、どれもうまくいきませんでした。どうすればこれを達成できるのでしょうか?

編集:これが解決策になると考えてコードを変更しましたが、どちらも機能しませんでした:

DbAdapter クラスの削除メソッド():

public boolean deleteContact(int rowId){
    getAllContactsList();
    return db.delete(DB_TABLE, COLUMN_ID + "=" + rowId, null) > 0;

}

getAllContactsList():

public List<Contact> getAllContactsList(){
    List<Contact> contactList = new ArrayList();

    Cursor c = db.query(DB_TABLE, new String [] {COLUMN_ID, COLUMN_FNAME, COLUMN_LNAME}, null, null, null, null, null);

    //loop through cursor rows and add to list
    if(c.moveToFirst()){
        do{
            Contact contact = new Contact();
            contact.setId(Integer.parseInt(c.getString(0)));
            contact.setfName(c.getString(1));
            contact.setlName(c.getString(2));
            contactList.add(contact);
        }while(c.moveToNext());
    }
    return contactList;
}public List<Contact> getAllContactsList(){
    List<Contact> contactList = new ArrayList();

    Cursor c = db.query(DB_TABLE, new String [] {COLUMN_ID, COLUMN_FNAME, COLUMN_LNAME}, null, null, null, null, null);

    //loop through cursor rows and add to list
    if(c.moveToFirst()){
        do{
            Contact contact = new Contact();
            contact.setId(Integer.parseInt(c.getString(0)));
            contact.setfName(c.getString(1));
            contact.setlName(c.getString(2));
            contactList.add(contact);
        }while(c.moveToNext());
    }
    return contactList;
}

連絡先を削除する前に新しいカーソルを取得すると、それに応じてリストが更新されると思いました。残念ながら違いはありませんでした。何か案は ?

4

3 に答える 3

0

Database Adapter クラスがあるようですが、ListView に表示されるアイテムのリストを管理するための ArrayAdapter クラスがありません。この例、特に WeatherAdapter.java クラスを見てください。

私の仮定が間違っていてadapter、コード内のオブジェクトがデータベース アダプターではなく ArrayAdapter クラスである場合adapter.notifyDataSetChanged()は、this.notifyDataSetChanged() の代わりに配置してみてください。

これが役に立ったかどうか教えてください。

于 2013-01-15T00:09:27.610 に答える
0

基になるデータを変更したことをリストのアダプターに通知する必要があります。

使ってみてadapter.notifyDataSetChanged();

于 2013-01-14T23:14:50.987 に答える
0

再クエリを実行して、新しいリストを生成する必要があります。

public void updateList(){
    clear();
    addAll(contactsDbHelper.getAllContactsList()); //addAll works since 11 API version.
    notifyDataSetChanged(); //need this is you dissabled auto notify
}

PSコンテンツ プロバイダーCursorAdapterを使用してこのジョブを実行する必要がありますがCursor.requery()、11 バージョン以降は非推奨になっているため、変更についてコンテンツ プロバイダーに手動で通知する必要があります。

于 2013-01-14T23:16:06.243 に答える