Я использую AbsListView.MultiChoiceModeListener, чтобы выбрать несколько элементов и удалить их из базы данных ListView (List) и SQLite.ListView обычно заполняется данными из других действий.По коду, как показано ниже, метод onActionItemClicked (режим ActionMode, элемент MenuItem) удаляет только два элемента из списка.Также, если вернуться к предыдущей активности и вновь открыть список действий, список снова заполняется данными, как это было вначале.Как выбрать и удалить элементы из базы данных arraylist и SQLite и обновить список в этом упражнении?Пожалуйста, кто-нибудь может показать более подробное решение этой проблемы?
Класс DataBaseHelper
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.style.UpdateAppearance;
import android.util.Log;
import android.view.MenuItem;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String TABLE_NAME = "value_table";
private static final String COL1 = "ID";
private static final String COL2 = "name";
public DatabaseHelper(Context context/*, String name, SQLiteDatabase.CursorFactory factory, int version*/) {
super(context, TABLE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
COL2 +" TEXT)";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME);
onCreate(db);
}
public boolean addData(String item) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL2, item);
long result = db.insert(TABLE_NAME, null, contentValues);
//if date as inserted incorrectly it will return -1
if (result == -1) {
return false;
} else {
return true;
}
}
public Cursor getData(){
SQLiteDatabase db = this.getWritableDatabase();
String query = "SELECT * FROM " + TABLE_NAME;
Cursor data = db.rawQuery(query, null);
return data;
}
public Cursor getItemID(String name){
SQLiteDatabase db = this.getWritableDatabase();
String query = "SELECT " + COL1 + " FROM " + TABLE_NAME +
" WHERE " + COL2 + " = '" + name + "'";
Cursor data = db.rawQuery(query, null);
return data;
}
/**
* Updates the name field
* @param newName
* @param id
* @param oldName
*/
public void updateName(String newName, int id, String oldName){
SQLiteDatabase db = this.getWritableDatabase();
String query = "UPDATE " + TABLE_NAME + " SET " + COL2 +
" = '" + newName + "' WHERE " + COL1 + " = '" + id + "'" +
" AND " + COL2 + " = '" + oldName + "'";
db.execSQL(query);
}
public void onOpen() {
}
/**
* Delete from database
* @param id
* @param name
*/
public void deleteName(int id, String name){
SQLiteDatabase db = this.getWritableDatabase();
String query = "DELETE FROM " + TABLE_NAME + " WHERE "
+ COL1 + " = '" + id + "'" +
" AND " + COL2 + " = '" + name + "'";
db.execSQL(query);
}
public void remove(String id){
SQLiteDatabase db = this.getWritableDatabase();
String query = "DELETE FROM " + TABLE_NAME + " WHERE "
+ COL1 + " = '" + id + "'";
db.execSQL( query);
}
public void Delete(String tablename, String pos) {
SQLiteDatabase db = this.getWritableDatabase();
try {
db.delete(tablename, "product_code" + "='" + pos + "'", null);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Класс ListDataActivity
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class ListDataActivity extends AppCompatActivity{
final String SAVED_TEXT = "saved_content10";
DatabaseHelper mDatabaseHelper;
private ListView mListView;
ArrayList<String> listData;
ArrayList<String> UserSelection = new ArrayList<>();
ListAdapter adapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_layout);
mListView = (ListView) findViewById(R.id.listView);
mListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
mListView.setMultiChoiceModeListener(modeListener);
mDatabaseHelper = new DatabaseHelper(this);
populateListView();
}
private void populateListView() {
//get the data and append to a list
Cursor data = mDatabaseHelper.getData();
listData = new ArrayList<>();
while (data.moveToNext()) {
//get the value from the database in column 1
//then add it to the ArrayList
listData.add(data.getString(1));
}
//create the list adapter and set the adapter
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listData);
mListView.setAdapter(adapter);
}
private void toastMessage(String message){
Toast.makeText(this,message, Toast.LENGTH_SHORT).show();
}
AbsListView.MultiChoiceModeListener modeListener=new AbsListView.MultiChoiceModeListener() {
int pos;
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
pos=position;
if (UserSelection.contains(listData.get(position))) {
UserSelection.remove(listData.get(position));
} else {
UserSelection.add(listData.get(position));
}
mode.setTitle(UserSelection.size() + " items selected....");
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater menuInflater = mode.getMenuInflater();
menuInflater.inflate(R.menu.menu_context, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_delete:
String str=listData.get(pos);
for (int i = (UserSelection.size() - 1); i >= 0; i--){
Delete_Item_DB(str);
listData.remove(str);
((BaseAdapter)
mListView.getAdapter()).notifyDataSetChanged();
}
break;
}
mode.finish();
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
};
public void Delete_Item_DB(String item_id) {
DatabaseHelper db = new DatabaseHelper(this);
db.Delete("value_table",item_id);
db.close();
}
}