2016-01-31 67 views
0

我想在listView中單擊項目後同時刪除listView和數據庫中的對象。我正試圖在刪除項目之前打開一個警告對話框。我看了一下這如許多其他堆棧溢出問題:在列表視圖和數據庫中刪除項目

how can i delete an item from listview and also database

delete a specific item from listview stored in database in android application

Delete item from database - ListView - Android

和很多人一樣......沒有人,我覺得非常有幫助。有什麼建議麼?

Main_Activity:

public class New_Recipe extends AppCompatActivity { 

Button add, done; 
EditText Recipe_Name, Recipe_Item, Recipe_Steps; 
String search; 
WebView webView; 
DatabaseHelper databaseHelper; 
ListView ItemsList; 
Context context = this; 
SQLiteDatabase sqLiteDatabase; 
Cursor cursor; 
RecipeListAdapter listAdapter; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_new__recipe); 
    setTitle("New Recipe"); 
    add = (Button) findViewById(R.id.button2); 
    done = (Button) findViewById(R.id.button); 
    Recipe_Name = (EditText) findViewById(R.id.editText); 
    Recipe_Item = (EditText) findViewById(R.id.editText2); 
    Recipe_Steps = (EditText) findViewById(R.id.editText3); 
    webView = (WebView) findViewById(R.id.webView); 
    ItemsList = (ListView) findViewById(R.id.listView); 
    listAdapter = new RecipeListAdapter(getApplicationContext(), R.layout.recipe_textview); 
    context = this; 
    AddData(); 



} 
//When the add button is pressed 
public void AddData() { 
    add.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String item = Recipe_Item.getText().toString(); 

      databaseHelper = new DatabaseHelper(context); 
      sqLiteDatabase = databaseHelper.getWritableDatabase(); 

      databaseHelper.addItems(item, sqLiteDatabase); 

      Toast.makeText(getBaseContext(), "Item inserted", Toast.LENGTH_LONG).show(); 

      databaseHelper.close(); 

      ItemsList.setAdapter(listAdapter); 

      databaseHelper = new DatabaseHelper(getApplicationContext()); 
      sqLiteDatabase = databaseHelper.getReadableDatabase(); 

      cursor = databaseHelper.getItems(sqLiteDatabase); 

      if (cursor.moveToFirst()) { 
       do { 

        String items; 

        items = cursor.getString(0); 

        RecipeDataProvider dataProvider = new RecipeDataProvider(items); 

        listAdapter.add(dataProvider); 

       } while (cursor.moveToNext()); 
      } 
     } 

    }); 

} 







public void onSearch(View v) { 
    search = "Recipes"; 
    webView.loadUrl("https://www.google.com/search?q=" + search); 

} 

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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

DatabaseHelper類:

public class DatabaseHelper extends SQLiteOpenHelper { 
public static final int DATABASE_VERSION = 5; 
public static final String DATABASE_NAME = "Recipes.db"; 
public static final String CREATE_QUERRY = "create table " + RecipeContract.RecipeEntry.TABLE_NAME + "(_ID INTEGER PRIMARY KEY, NAME text, ITEMS text, STEPS text)"; 


public DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    Log.d("Recipe Database", "Database should be made!"); 
} 


@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_QUERRY); 
    Log.d("Recipe Database", "Table should be made!"); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

} 

public void addItems(String items, SQLiteDatabase db) 
{ 
    ContentValues values = new ContentValues(); 

    values.put(RecipeContract.RecipeEntry.COL2,items); 

    db.insert(RecipeContract.RecipeEntry.TABLE_NAME,null,values); 

    Log.e("Recipe Database","Item should be added to the table!"); 

} 
public Cursor getItems(SQLiteDatabase db) 
{ 
    Cursor cursor; 
    String[] projections = {RecipeContract.RecipeEntry.COL2}; 

cursor = db.query(RecipeContract.RecipeEntry.TABLE_NAME,projections,null,null,null,null,null); 

    return cursor; 
} 

ListViewAdapter:

public class RecipeListAdapter extends ArrayAdapter { 

List list = new ArrayList(); 

public RecipeListAdapter(Context context, int resource) { 
    super(context, resource); 
} 

static class LayoutHandler 
{ 
    TextView ITEM; 
} 


@Override 
public void add(Object object) { 
    super.add(object); 
    list.add(object); 
} 

@Override 
public int getCount() { 
    return super.getCount(); 
} 

@Override 
public Object getItem(int position) { 
    return super.getItem(position); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View row = convertView; 

    LayoutHandler layoutHandler; 


    if (row == null) 
    { 

     LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = layoutInflater.inflate(R.layout.recipe_textview,parent,false); 

     layoutHandler = new LayoutHandler(); 

     layoutHandler.ITEM = (TextView) row.findViewById(R.id.tx_items); 

     row.setTag(layoutHandler); 

    } else { 

     layoutHandler = (LayoutHandler) row.getTag(); 
    } 

    RecipeDataProvider dataProvider = (RecipeDataProvider) this.getItem(position); 
    layoutHandler.ITEM.setText(dataProvider.getItems().toString()); 

    return row; 
} 

編輯:我更新Main_Activity類

public class New_Recipe extends AppCompatActivity { 

Button add, done; 
EditText Recipe_Name, Recipe_Item, Recipe_Steps; 
String search; 
WebView webView; 
DatabaseHelper databaseHelper; 
ListView ItemsList; 
Context context = this; 
SQLiteDatabase sqLiteDatabase; 
Cursor cursor; 
RecipeListAdapter listAdapter; 
List<New_Recipe> list = new ArrayList<>(); 
private int id; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_new__recipe); 
    setTitle("New Recipe"); 
    add = (Button) findViewById(R.id.button2); 
    done = (Button) findViewById(R.id.button); 
    Recipe_Name = (EditText) findViewById(R.id.editText); 
    Recipe_Item = (EditText) findViewById(R.id.editText2); 
    Recipe_Steps = (EditText) findViewById(R.id.editText3); 
    webView = (WebView) findViewById(R.id.webView); 
    ItemsList = (ListView) findViewById(R.id.listView); 
    listAdapter = new RecipeListAdapter(getApplicationContext(), R.layout.recipe_textview); 
    context = this; 

    AddData(); 


    ItemsList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
      Object getSelectedItem = list.get(position); 

      databaseHelper.deleteItem(getSelectedItem); 
      listAdapter.deleteitem(getSelectedItem); 

      return true; 
     } 
    }); 



} 

public New_Recipe(){ 

} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 
+0

如果您通過ContentProvider使數據庫數據可用,並通過它填充ListView(通過適配器),那麼當您刪除數據庫中的行時,ListView應自動更新。創建一個內容提供者需要更多的工作,但是您可能會發現它值得。 –

回答

0

你需要一個功能delete在DatabaseHelper類

public boolean delete(long rowId) { 
     return db.delete(TABLE_NAME, KEY_ROWID + "=" + rowId, null) > 0; 
    } 

您在活動deleteItem()類似需要一個函數來addItems()

public void deleteItem(){ 

//Based on some logic,find the rowID of the table which needs to be deleted and call delete function of DatabaseHelper class. 
} 

與您的ListViewAdapter類似,您需要定義一個方法delete

public void delete(Object object) { 
    list.remove(object); 
    //To update the ListView in Android 
    this.notifyDataSetChanged(); 
} 
0

您可以使用此方法從DatabaseHelper類刪除行:

public void deleteItem(Object item) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.delete(TABLE_NAME, KEY_ID + " = ?", 
      new String[]{String.valueOf(item.getId())}); 
    db.close(); 
} 

然後你還需要從適配器刪除對象的一個​​方法:

public void deleteItem(Object item) { 
    listArray.remove(item); 
    notifyDataSetChanged(); 
} 

現在,您可以在這樣的活動中調用所有此方法:

假設您想通過單擊lon來刪除所有這些g還列表項:

listView.setOnItemLongClickListener(new OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
       int pos, long id) { 
      Object getSelectedItem = arrayList.get(pos); 

      dataBaseHelper.deleteItem(getSelectedItem); 
      adapter.deleteItem(getSelectedItem); 

      return true; 
     } 
    }); 

更新:

你試圖調用方法getId()建立在你的類方法之前,您需要。所以,你需要創建獲得和setter方法在你的類,像這樣:

一步一步:

  1. 更改類New_RecipeMainActivity。如果您收到錯誤,只需突出顯示該錯誤,您將看到「重命名文件」。

  2. 主類以外創建一個新的類,並調用它NewRecipe

    public class NewRecipe {

    private int id;

    private String title;

    public NewRecipe() { // empty constructor }

    public int getId() { return id; }

    public void setId(int id) { this.id = id; } }

現在你可以做的一切我前面已經解釋過。

+0

感謝您的回答!當我嘗試鍵入'(item.getId())});'它只給我輸入'(item.getClass())});'的選項。 arrayList.get(pos)中的arrayList與'listArray.remove(item)'中的一樣嗎?如果是這樣的話,你如何在不同的類中使用arrayList變量?我對此很新... – Eklassen

+0

檢查我更新的答案。 –

+0

你解決了你的問題嗎? –

相關問題