亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用光標獲取項目的位置并刪除它?

如何使用光標獲取項目的位置并刪除它?

繁花不似錦 2024-01-28 16:45:57
我正在制作包含書簽的webview應用程序,我使用Cursor和SQLite 數據庫成功將項目添加到listView中,但我的問題是我無法獲取項目的位置并刪除它我嘗試以自己的方式執行此操作,但我得到的是我已經刪除了列表視圖的所有內容。這是我的MainActivity,我制作了一個longClickItemListener來刪除長按時的列表視圖項目,這是我的BookmarkDatabase主要活動final Dialog bookmarksScreen = new Dialog(this);        bookmarksScreen.requestWindowFeature(Window.FEATURE_NO_TITLE);        bookmarksScreen.setContentView(R.layout.activity_bookmark);        bookmarksScreen.setCancelable(true);        final ListView listView = bookmarksScreen.findViewById(R.id.bookmark_list);        ImageView bookmarkBack   = bookmarksScreen.findViewById(R.id.close_bookmarks);        ImageView bookmarkDelete = bookmarksScreen.findViewById(R.id.delete_table);        // populate an ArrayList<String> from the database and then view it        final ArrayList<String> theList = new ArrayList<>();        Cursor data = bookmarkDB.getListContents();        // check if there is no data on database        if(data.getCount() == 0){            Log.d("Database Bookmark", "There is no items on item list");        } else {            while(data.moveToNext()) {                // add data into table "COL1" and "COL2"                theList.add(data.getString(1));                ListAdapter listAdapter = new ArrayAdapter<>(this, R.layout.activity_listitem, theList);                listView.setAdapter(listAdapter);            }        }        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                String item = parent.getItemAtPosition(position).toString();                webView.loadUrl(item);                bookmarksScreen.dismiss();            }        });
查看完整描述

1 回答

?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

理想情況下,您將在視圖中可檢索的地方使用主鍵(或者反之亦然,使用已在可檢索的地方使用的值作為主鍵)。由于這里的主鍵是一個auto_increment字段,因此它與您嘗試刪除的視圖之間沒有真正可靠的關聯(至少從我在您的代碼中看到的)。一種方法是Adapter為您的列表使用自定義項,而不是ArrayAdapter, 并使用View.setTag()View.getTag()方法來存儲列表中每個項目的主鍵。

假設您的activity_listitem布局有一個TextViewwith id?text_view,您在其中顯示從數據庫獲取的文本,并且您已添加存儲主鍵的標簽,您可以在主活動中執行以下操作:

? ? listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

? ? ? ? @Override

? ? ? ? public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

? ? ? ? ? ? TextView textView = (TextView) view.findViewById(R.id.text_view);

? ? ? ? ? ? final Integer which_item = (Integer) textView.getTag();? ? //Assuming you stored the ID as an Integer

? ? ? ? ? ? int rowsDeleted = bookmarksDB.deleteSpecificContent(which_item);

? ? ? ? ? ? if(rowsDeleted == 0){? //should be 1, since we're deleting by Primary Key

? ? ? ? ? ? ? ? //if you would like like, handle if nothing was deleted

? ? ? ? ? ? }

? ? ? ? ? ? return true;

? ? ? ? }

? ? });

在您的 BookmarksDatabase 類中:


? ? public int deleteSpecificContents(int id) {

? ? ? ? SQLiteDatabase db = this.getWritableDatabase();

? ? ? ? return db.delete(TABLE_NAME, COL1 + "=?", new String[]{Integer.toString(id)});

? ? }


如果您不想使用自定義Adapter,另一種方法是使用列表中的位置來確定要刪除的項目。您可以通過查詢數據庫并迭代Cursor直到它與列表中項目的位置匹配來完成此操作。


? ? listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

? ? ? ? @Override

? ? ? ? public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

? ? ? ? ? ? Cursor data = bookmarkDB.getListContents();

? ? ? ? ? ? int i = 0;

? ? ? ? ? ? while(data.moveToNext()){

? ? ? ? ? ? ? ? if(i == position){

? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? i++;

? ? ? ? ? ? }

? ? ? ? ? ? int rowsDeleted = bookmarkDB.deleteSpecificContent(data.getInt(0));

? ? ? ? ? ? //again, handle if rowsDeleted != 1 if you want

? ? ? ? ? ? return true;

? ? ? ? }

? ? });

您的BookmarkDatabase.deleteSpecificContent()方法與第一種方法完全相同 - 唯一的區別在于如何確定要刪除的項目的 id。如果您不想處理deleteSpecificContent()不返回 1 的情況(除非我在這里遺漏了一些主要內容,否則在您的用例中它應該始終返回 1),請隨意將其簽名更改為void, 而不是int。


請注意,第二種方法比第一種方法更昂貴,因為它需要額外的數據庫查詢,并且可能會迭代很多Cursor。雖然它需要更少的新/更改的代碼,但可能不建議使用(老實說我不能肯定地說。這可能適合您的用例,具體取決于您的數據庫的大小,但是 - 完全披露 - 我是沒有足夠的 Android 經驗來撥打此電話。請自行決定使用)。


查看完整回答
反對 回復 2024-01-28
  • 1 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號