2014-01-06 160 views
0

你好我正在開發一個帶有Task Viewer的應用程序,我可以添加任務但不刪除。 我如何刪除它們? 另一個問題:當我點擊複選框時,如何更改顯示的消息? TaskerDbHelper在SQLite數據庫中刪除任務

public class TaskerDbHelper extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 1; 

// Database Name 
private static final String DATABASE_NAME = "taskerManager"; 

// tasks table name 
private static final String TABLE_TASKS = "tasks"; 

// tasks Table Columns names 
private static final String KEY_ID = "id"; 
private static final String KEY_TASKNAME = "taskName"; 
private static final String KEY_STATUS = "status"; 

public TaskerDbHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 

    String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_TASKS + " (" 
      + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_TASKNAME 
      + " TEXT, " + KEY_STATUS + " INTEGER)"; 
    db.execSQL(sql); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldV, int newV) { 
    // Drop older table if existed 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_TASKS); 
    // Create tables again 
    onCreate(db); 
} 

// Adding new task 
public void addTask(Task task) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(KEY_TASKNAME, task.getTaskName()); // task name 
    // status of task- can be 0 for not done and 1 for done 
    values.put(KEY_STATUS, task.getStatus()); 

    // Inserting Row 
    db.insert(TABLE_TASKS, null, values); 
    db.close(); // Closing database connection 
} 

public List<Task> getAllTasks() { 
    List<Task> taskList = new ArrayList<Task>(); 
    // Select All Query 
    String selectQuery = "SELECT * FROM " + TABLE_TASKS; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      Task task = new Task(); 
      task.setId(cursor.getInt(0)); 
      task.setTaskName(cursor.getString(1)); 
      task.setStatus(cursor.getInt(2)); 
      // Adding contact to list 
      taskList.add(task); 
     } while (cursor.moveToNext()); 
    } 

    // return task list 
    return taskList; 
} 

public void updateTask(Task task) { 
    // updating row 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(KEY_TASKNAME, task.getTaskName()); 
    values.put(KEY_STATUS, task.getStatus()); 
    db.update(TABLE_TASKS, values, KEY_ID + " = ?",new String[] {String.valueOf(task.getId())}); 
    db.close(); 
} 

ViewTask

public class ViewTask extends Activity { 
protected TaskerDbHelper db; 
List<Task> list; 
MyAdapter adapt; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_view_task); 
    db = new TaskerDbHelper(this); 
    list = db.getAllTasks(); 
    adapt = new MyAdapter(this, R.layout.list_inner_view, list); 
    ListView listTask = (ListView) findViewById(R.id.listView1); 
    listTask.setAdapter(adapt); 
} 

public void addTaskNow(View v) { 
    EditText t = (EditText) findViewById(R.id.editText1); 
    String s = t.getText().toString(); 
    if (s.equalsIgnoreCase("")) { 
     Toast.makeText(this, "enter the task description first!!", 
       Toast.LENGTH_LONG); 
    } else { 
     Task task = new Task(s, 0); 
     db.addTask(task); 
     Log.d("tasker", "data added"); 
     t.setText(""); 
     adapt.add(task); 
     adapt.notifyDataSetChanged(); 
    } 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_view_task, menu); 
    return true; 
} 

private class MyAdapter extends ArrayAdapter<Task> { 

    Context context; 
    List<Task> taskList = new ArrayList<Task>(); 
    int layoutResourceId; 

    public MyAdapter(Context context, int layoutResourceId, 
      List<Task> objects) { 
     super(context, layoutResourceId, objects); 
     this.layoutResourceId = layoutResourceId; 
     this.taskList = objects; 
     this.context = context; 
    } 

    /** 
    * This method will DEFINe what the view inside the list view will 
    * finally look like Here we are going to code that the checkbox state 
    * is the status of task and check box text is the task name 
    */ 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     CheckBox chk = null; 
     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.list_inner_view, 
        parent, false); 
      chk = (CheckBox) convertView.findViewById(R.id.chkStatus); 
      convertView.setTag(chk); 

      chk.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        CheckBox cb = (CheckBox) v; 
        Task changeTask = (Task) cb.getTag(); 
        changeTask.setStatus(cb.isChecked() == true ? 1 : 0); 
        db.updateTask(changeTask); 
        Toast.makeText(
          getApplicationContext(), 
          "Clicked on Checkbox: " + cb.getText() + " is " 
            + cb.isChecked(), Toast.LENGTH_LONG) 
          .show(); 
       } 

      }); 
     } else { 
      chk = (CheckBox) convertView.getTag(); 
     } 
     Task current = taskList.get(position); 
     chk.setText(current.getTaskName()); 
     chk.setChecked(current.getStatus() == 1 ? true : false); 
     chk.setTag(current); 
     Log.d("listener", String.valueOf(current.getId())); 
     return convertView; 
    } 

} 

佈局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".ViewTask" 
android:background="@drawable/fondo"> 

<EditText 
    android:id="@+id/editText1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:ems="10" 
    android:layout_alignBottom="@+id/button1" 
    android:layout_toLeftOf="@+id/button1"> 

    <requestFocus /> 
</EditText> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginRight="14dp" 
    android:text="Afegir" 
    android:onClick="addTaskNow" 
    android:textSize="30dp" /> 

<ListView 
    android:id="@+id/listView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/button1"> 
</ListView> 

+0

所以,你想刪除特定的任務或選中的所有任務? – InnocentKiller

+0

特定任務。謝謝。 – pkssssss

+0

我已經根據您的要求更新了您的問題,只是做了必要的調整並使用它。 – InnocentKiller

回答

0

使用下面的代碼刪除選定的特定任務,只需將下面的代碼放入刪除按鈕的單擊事件中即可。

int len = mListView.getCount(); 
SparseBooleanArray checked = listTask.getCheckedItemPositions(); 
(int i = 0; i < len; i++) 
if (checked.get(i)) { 
String[] delete = list.get(i); 
String idString = delete[0]; 
long idLong = Long.valueOf(idString); 
db.delete(idLong); 
list.remove(i); 
+0

我如何放置刪除按鈕?謝謝 – pkssssss

+0

要麼你可以放在你的列表視圖下面,或者你可以把這段代碼放到你的listview onitemclicklistner裏面。無論你想... – InnocentKiller

+0

對不起,不明白我是一個新手,檢查我的佈局。我在哪裏放刪除按鈕的點擊? – pkssssss

0

您需要獲取已被單擊的任務的KEY_ID,然後調用該任務的remove方法。刪除方法可能如下

public void task_delete_byID(int id){ 
    db.delete(TABLE_TASKS, KEY_ID+"="+id, null); 
} 

要刪除多個記錄,在調用「task_delete_byID」方法時使用循環。

希望這有助於。