Ребят, вопрос требует представления большого количества кода, но очень и очень важен для меня... Не могу разобраться уже что только не перепробовал....
Может я что-то не так делаю или что нужно сделать чтобы добиться цели, а цель такая:
При нажатии кнопки меню "Удалить" появляются чекбоксы и items в меню меняются на "Подтвердить удаление" и "Отмена".
При подтверждении удаления выбранные строки нужно удалить из БД, что собственно и не получается... Не понимаю как мне получить id строки, в которой расположен чекбокс и сопоставить с id в БД...
MainActivity class
Код: Выделить всё
[syntax=java5]public class MainActivity extends ActionBarActivity implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener{
Intent intentAddContact;
Intent intentSettings;
ListView lvMain;
CheckBox cbx;
MenuItem addContact, deleteContact, settings, expimp, confirmDelete, cancelDelete;
View view;
Cursor cursor;
DB mDB;
MySCAdapter scAdapter;
String[] from = null;
int[] to = null;
SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lvMain = (ListView)findViewById(R.id.lvMain);
mDB = new DB(this);
mDB.openConnection();
onCreateAdapter();
}
public void onCreateAdapter(){
from = new String[] { DB.COL_LINK, DB.COL_SURNAME, DB.COL_NAME };
to = new int[] { R.id.ivPhoto, R.id.tvSurname, R.id.tvName };
if(to[3] == 0){
to[3] = R.drawable.default_contact;
}
scAdapter = new MySCAdapter(this, R.layout.item, null, from, to, 0);
lvMain.setAdapter(scAdapter);
lvMain.setOnItemClickListener(this);
getSupportLoaderManager().initLoader(LOADER_ID_ALL, null, this);
}
public void deleteRecord(){
//устанавливаем видимость элементов ActionBar при выборе удалить
addContact.setVisible(false);
deleteContact.setVisible(false);
settings.setVisible(false);
expimp.setVisible(false);
confirmDelete.setVisible(true);
cancelDelete.setVisible(true);
for(int i = 0; i < lvMain.getChildCount(); i++) {
lvMain.getChildAt(i).findViewById(R.id.cbxList).setVisibility(View.VISIBLE);
}
}
public void onCancelDeleteRecord(){
for(int i = 0; i < lvMain.getChildCount(); i++) {
lvMain.getChildAt(i).findViewById(R.id.cbxList).setVisibility(View.INVISIBLE);
}
//устанавливаем видимость элементов ActionBar при отмене удаления
addContact.setVisible(true);
deleteContact.setVisible(true);
settings.setVisible(true);
expimp.setVisible(true);
confirmDelete.setVisible(false);
cancelDelete.setVisible(false);
}
public void confirmDeleteRecord(){
//устанавливаем видимость элементов ActionBar при подтверждении удаления
addContact.setVisible(true);
deleteContact.setVisible(true);
settings.setVisible(true);
expimp.setVisible(true);
confirmDelete.setVisible(false);
cancelDelete.setVisible(false);
for(int i = 0; i < lvMain.getChildCount(); i++) {
lvMain.getChildAt(i).findViewById(R.id.cbxList).setVisibility(View.INVISIBLE);
}
}
@Override
protected void onRestart(){
super.onRestart();
mDB.openConnection();
}
@Override
protected void onStop(){
super.onStop();
mDB.closeConnection();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
addContact = menu.findItem(R.id.addContact);
deleteContact = menu.findItem(R.id.deleteContact);
settings = menu.findItem(R.id.settings);
expimp = menu.findItem(R.id.expimp);
confirmDelete = menu.findItem(R.id.confirmDelete);
cancelDelete = menu.findItem(R.id.cancelDelete);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.addContact:
intentAddContact = new Intent(this, NewContact.class);
startActivity(intentAddContact);
break;
case R.id.deleteContact:
deleteRecord();
break;
case R.id.settings:
intentSettings = new Intent(this, PrefActivity.class);
startActivityForResult(intentSettings, 0);
break;
case R.id.expimp:
break;
case R.id.confirmDelete:
confirmDeleteRecord();
break;
case R.id.cancelDelete:
onCancelDeleteRecord();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onItemClick(AdapterView<?> parent, View itemClicked, int position, long id){
//Здесь будет переход на страницу с инфо о контакте
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
return new MyCursorLoader(this, mDB, cursor);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
scAdapter.swapCursor(c);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
scAdapter.swapCursor(null);
}
}[/syntax]Код: Выделить всё
[syntax=java]public class DB {
private static final String DB_NAME = "phonebook.db";
private final static int VERSION = 1;
public static final String TABLE_NAME = "contacts";
private static final String CREATE_ENTRIES = "CREATE TABLE contacts ("
+ "_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "name TEXT,"
+ "surname TEXT,"
+ "birthday INTEGER,"
+ "sex INTEGER,"
+ "adress TEXT,"
+ "link TEXT" + ");";
private static final String DELETE_ENTRIES = "DROP TABLE IF EXISTS " + TABLE_NAME;
public static final String COL_NAME = "name";
public static final String COL_SURNAME = "surname";
public static final String COL_BIRTHDAY = "birthday";
public static final String COL_SEX = "sex";
public static final String COL_ADRESS = "adress";
public static final String COL_LINK = "link";
public static final String ID = "_id";
private SQLiteDatabase mDB;
private DBHelper dbHelper;
Context mCtx;
public DB(Context ctx) {
mCtx = ctx;
}
public void openConnection(){
dbHelper = new DBHelper(mCtx, DB_NAME, null, VERSION);
mDB = dbHelper.getWritableDatabase();
}
public void closeConnection(){
if(dbHelper != null) dbHelper.close();
}
//Этот метод будет вызываться при удалении записи!
public void deleteCheckedRows(long id){
mDB.delete(TABLE_NAME, ID + " = " + id, null);
}
public Cursor queryDB(String table, String[] columns, String selection, String[] selectionArgs,
String groupBy, String having, String orderBy){
return mDB.query(TABLE_NAME, null, null, null, null, null, COL_NAME);
}
public void insert(String inputName, String inputSurname,
int inputBirthday, int inputSex,
String inputAdress, String photoLink){
//создаём объект для данных и наполняем базу данными
ContentValues cv = new ContentValues();
cv.put(COL_NAME, inputName);
cv.put(COL_SURNAME, inputSurname);
cv.put(COL_BIRTHDAY, inputBirthday); //ИЗМЕНИТЬ ТИП ВТОРОГО ПАРАМЕТРА!!!!!!!!!!!!!!
cv.put(COL_SEX, inputSex);
cv.put(COL_ADRESS, inputAdress);
cv.put(COL_LINK, photoLink);
mDB.insert(TABLE_NAME, null, cv);
}
private class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, String name, CursorFactory factory,
int version){
super(context, DB_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_ENTRIES);
Log.d(LOG, "Таблица создана");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(DELETE_ENTRIES);
onCreate(db);
}
}
}
[/syntax]И код SimpleCursorAdapter
Код: Выделить всё
[syntax=java]public class MySCAdapter extends SimpleCursorAdapter {
private LayoutInflater mLayoutInflater;
CheckBox cbxList;
long id;
View view;
public MySCAdapter(Context context, int layout, Cursor c, String[] from,
int[] to, int flags) {
super(context, layout, c, from, to, flags);
mLayoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mLayoutInflater.inflate(R.layout.item, parent, false);
}
view = super.getView(position, convertView, parent);
cbxList = ((CheckBox)convertView.findViewById(R.id.cbxList));
return view;
}
}[/syntax]