2016-10-25 86 views
1

我在我的數據庫中有一些值,並使用自定義光標適配器填充自定義Listview中的值。因此,當用戶點擊listView時,會打開一個新的活動並且他選擇該值或視圖的刪除按鈕應消失,並且應該刷新列表。從列表視圖中刪除視圖/值Android

我在SO上提到了很多答案,但他們都建議從數據庫中刪除值(這不是我想要的),有的使用ArrayList,並建議我將它與自定義數組適配器一起使用。但是我我正在使用光標適配器。

所以我的整個問題是如何刪除值或從列表視圖中刪除視圖?

的ListView項的onClick監聽器打開一個新的活動

@Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
// Constants.ROW_NUMBER=position; 
     TextView getRecordID = (TextView) view.findViewById(R.id.recordID); 
     Constants.ROW_NUMBER = Integer.parseInt(getRecordID.getText().toString()); 

     Intent editIntent = new Intent(this,NoteDisplay.class); 
     editIntent.putExtra(Constants.ROW_NAME,Constants.ROW_NUMBER); 
     startActivity(editIntent); 

    } 

這是新的活動,並在菜單按鈕的按下記錄將被標記爲刪除,但不會從數據庫中刪除。

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     switch (item.getItemId()) 
     { 

      case R.id.deletebutton: 

       DataBaseHelper deletedb = new DataBaseHelper(this); 
       int deletedata = deletedb.deleteAction(position,System.currentTimeMillis()); 
       Intent dintent = new Intent(this,MainActivity.class); 
       dintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
       startActivity(dintent); 

       return true; 

      default: 
       return super.onOptionsItemSelected(item); 

     } 
    } 

這是我的自定義光標適配器類,

@Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     return inflater.inflate(R.layout.customlistview, parent, false); 
    } 



    @Override 
     public void bindView(View view, Context context, Cursor cursor) { 
    //int getDeleteFlag is initialized above 
       getDeleteFlag = cursor.getInt(cursor.getColumnIndex(DELETE_FLAG)); 

     if(getDeleteFlag==0) 
     { 
      ll = (LinearLayout)view.findViewById(R.id.listViewLayout); 
      setListViewHeight(ll,context); 

      if (cursor != null) { 
       getText = cursor.getString(cursor.getColumnIndex(NOTE_TITLE)); 
       existsRecordID = cursor.getString(cursor.getColumnIndex(RECORD_ID)); 
       datevalue = cursor.getLong(cursor.getColumnIndex(RECORD_DATE)); 
} 
      Date newdate = new Date(datevalue); 
      tv = (TextView) view.findViewById(R.id.content); 
      recordID = (TextView) view.findViewById(R.id.recordID); 
      dateET = (TextView) view.findViewById(R.id.date); 
      tv.setText(getText.trim()); 
      recordID.setText(existsRecordID); 
      dateET.setText(dateFormatter.format(newdate)); 
     }else{ 
      Toast.makeText(context, "FALSE VALUE", Toast.LENGTH_SHORT).show(); 
     } 

     } 

我很困惑是否要刪除視圖或在該點的數值。

我有一個名爲「deleteflag」的行,在我的DB中存儲1 =>刪除了 0 =>未刪除。

所以只有具有1的值纔會被標記爲刪除。

編輯1:

bindView()方法上面的代碼不起作用

+0

如果你只是從列表視圖中刪除,那麼它將被刪除,但它不會從數據庫中刪除,所以當你再次在該頁面時,你可以看到刪除的視圖(行),因爲它不會從數據庫中刪除 – Piyush

+0

@Piyush如果我檢查'if(deleteflag == 0)'只有顯示視圖否則不顯示?如果是的話,這怎麼辦? –

+0

您可以將該標誌存儲在數據庫中 – Piyush

回答

0

像你說的不從數據庫中刪除的項目只是把deleteflag = 1 它是確定

但是當你回到你的列表或即將到您的列表,你應該做如下因素

Cursor yCursor = db.rawQuery("SELECT * FROM table where deleteflag!=1", null); 
yAdapter.changeCursor(yCursor); 

如果你正在使用的活動比你可以做你的onactivityresult或onResume活動

它只會刷新您的適配器與最新光標誰沒有刪除

+0

是的,我所有的嘗試兄弟,但儘管使用刪除標誌該項目仍然出現在列表視圖。 –

+0

當我尋找您的代碼時,您將從數據庫中提取所有數據並檢查綁定視圖中的標誌。但我說的是不要把所有的數據寫在query.can中,你可以分享你的數據庫查詢嗎? –

0

你要存儲在數據庫中deleteFlag值0和1的值。

所以,當你試圖從那個時候刪除行/視圖,你必須從0該標誌值更新爲1

此外,更新舊數據之後,你必須執行從數據庫中刪除該行的查詢。

然後不要忘記在從數據庫中刪除數據後立即致電yourAdapterName.notifyDataSetChanged();

隨意評論,如果這不能解決您的問題

你可以看到這個link會幫助你。

並且您在適配器內寫入錯誤的代碼。

你不能過濾適配器內部,通過檢查你的光標條件bcz是否持有該數據也有deleteFlag = 1;所以如果條件將不起作用

你必須執行這個步驟從我有共享的鏈接。你需要更新光標,而不是CursorAdapter。

newCursor = db.rawQuery("SELECT * FROM mytable where deleteflag ==0 ", null); 
myCursorAdapter.changeCursor(newCursor); 

所以最後它會做的是它只能容納其中有deleteFlag == 0

所以,你會解決你的問題,以及不會出現多餘的行還有那些記錄其不包含deleteFlag = 1;

希望這會解決您的問題。

請標記爲接受的答案,如果這可以幫助你。