Удаление выбранных checkbox-ов внутри listview из БД

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Yurets » 13 июл 2014, 00:31

Всем привет!
Ребят, вопрос требует представления большого количества кода, но очень и очень важен для меня... Не могу разобраться уже что только не перепробовал....
Может я что-то не так делаю или что нужно сделать чтобы добиться цели, а цель такая:

При нажатии кнопки меню "Удалить" появляются чекбоксы и 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]
DB class. Здесь, по сути, интересен только метод deleteCheckedRows

Код: Выделить всё

[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]
Class с CursorLoader не буду выкидывать, чтоб сократить и так большой код, там только в методе loadInBackground создан cursor с текстом запроса.
И код 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]
Перепробавал и перечитал столько всего за 4 дня и всё тщетно... буду очень благодарен за любую помощь!!

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Foenix » 13 июл 2014, 00:42

не сможешь ты так сделать с таким устройством списка. У тебя список основан на курсоре, а в курсор нельзя внести изменения, поэтому даже если ты покажешь чекбоксы и пользователь начнет что-то щелкать, то при прокрутке списка (может он хочет удалить допустим 1 и последнюю записи - начнется катавасия.

Поэтому или списко тебе нужно основывать на коллекциях (1), либо удалять по одному (2), либо в таблице предусматривать специальное поле (3), где будет 0 или 1 и когда юзер будет щелкать по чекбоксам будет меняться это поле и потом удалять все записи где это поле =1.
Самое простое это способ 2. Если хочешь красиво - огранизуй удаление свайпом с анимацией (как в gmail приложении). ДЛя этого можно какую-то библиотеку нормальную просто использовать.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Foenix » 13 июл 2014, 00:45

и раз есть курсор-лоадер, то уже и контент-провайдер делай до кучи, или он у тебя есть, не вижу я.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Yurets » 13 июл 2014, 01:00

ну вот да, я так и думал, что по одному, вот только как это всё привязать вообще не могу понять, т.к. из класса adapter-a, я не могу вызвать метод Удалить из класса Бд, а в MainActivity не могу получить позиции выбранных cbx-ов, т.к. нет к ним доступа... Самое оригинальное что смог придумать это создать ещё одно textview невидимое и там хранить id записей базы и так уже как-то это привязать, но это даже звучит странно "невидимое textview с id"))

а контент провайдер тоже будет, всё верно, хочу просто сам механизм сначала отладить...

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Yurets » 13 июл 2014, 01:02

а если по одному удалять, можешь, пожалуйста, расписать механизм? всё равно не вкуриваю как это совместить..

ааа, по одному имеется в виду выбранный чекбокс, потом кнопка удалить, потом снова выбирать, да? если да, то так не годиться....(

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Foenix » 13 июл 2014, 01:18

нет, по-одному это без чекбоксов совсем. Чекбокс это когда чего-то много.
по-одному самый хороший вариант это свайп, я его описала
еще варианты могут быть разные, например если есть диалог редактирования айтема, то в этом диалоге можно предусмотреть кнопку удаления. Или нажимаем на кнопку удаления на экшнбаре - и потом щелкаем на удаляемый элемент (но в этом варианте я как-то не уверена).
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Yurets » 13 июл 2014, 01:23

та вот тут и вся фишка, что нужно именно через чекбоксы, так бы я уже забил на это дело)
в общем, буду как-то изощряться, выхода другого нет...
спасибо за наводки, очень полезно!

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Foenix » 13 июл 2014, 01:23

Yurets писал(а):ну вот да, я так и думал, что по одному, вот только как это всё привязать вообще не могу понять, т.к. из класса adapter-a, я не могу вызвать метод Удалить из класса Бд, а в MainActivity не могу получить позиции выбранных cbx-ов, т.к. нет к ним доступа... Самое оригинальное что смог придумать это создать ещё одно textview невидимое и там хранить id записей базы и так уже как-то это привязать, но это даже звучит странно "невидимое textview с id"))

а контент провайдер тоже будет, всё верно, хочу просто сам механизм сначала отладить...
почему из адаптера ты не можешь удалять?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Foenix » 13 июл 2014, 01:26

Yurets писал(а):та вот тут и вся фишка, что нужно именно через чекбоксы, так бы я уже забил на это дело)
в общем, буду как-то изощряться, выхода другого нет...
спасибо за наводки, очень полезно!
если нужны чекбоксы - действия я описала. Делай не курсорадаптер, а обычный и основывай его на массиве типов. А этот массив заполняй из полученного курсора. Тогда при клике на чекбокс заполняй этот массив (есть кажется в уроках) и по кнопке "удалить" удаляй все записи...

ноя бы сделала поле в таблице . Его можно не только для удаления потом использовать. И код переделывать не нужно.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Yurets » 13 июл 2014, 01:30

создаю экземпляр класса DB, вызываю метод deleteCkeckedRows, пытаюсь что-то передать (по типам всё сходиться, должно работать), но nullpointerexception на этой строке mDB.deleteCkeckedRows(id); и хоть убей)) это я делал в методе getView, и так понял что из этого класса я не могу обращаться к методам в базе... или я ступил как-то?

я тоже на этот способ обратил внимание, по-моему, он тоже самый простой и функциональный...

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Yurets » 13 июл 2014, 01:57

Ну всё, создал колонку в таблице, должно быть всё ок, только по-прежнему не догоняю как получить id записи (записи в БД), где установился чекбокс...
сделал в методе getview checkedChangeListener и если isChecked - обновлять строку в БД (вот только какую? нужно позицию передать), а в mainactivity при нажатии "подтвердить удаление", будут удаляться все записи, где в cbx-колонке есть "1".
и я думаю, если получится, можно в цикле попробовать удалять for(int i : массив полученных id){mDB.delete(i)};

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Foenix » 13 июл 2014, 03:28

да все это есть в уроках.
по position
делаешь курсору в адаптере movetoposition(position) , достаешь из него id и обновляй строку по чекбоксу
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Yurets » 13 июл 2014, 17:10

Последний момент, поясни, пожалуйста, а то как-то туго...

В адаптере установил слушатель на изменение чекбокса и в цикле передвигаюсь по курсору до выбранного чекбокса, но isChecked у меня на всех i выполняется... я неправильно обращаюсь либо неправильно определил чекбокс.
Как сделать чтобы код в условии выполнялся только один раз, а не на всех i?

Код: Выделить всё

@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));
			Log.d("phonebookLogs", " " + getCursor().moveToPosition(cbxPosition) + "   " + getCursor().getInt(mCursor.getColumnIndex(DB.ID)));
			getCursor().getInt(mCursor.getColumnIndex(DB.ID));
			mDB = new DB(mContext);


			cbxList.setOnCheckedChangeListener(new OnCheckedChangeListener() {

				@Override
				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
					for(int i = 0; i < getCursor().getCount(); i++){
						getCursor().moveToPosition(i);
						CheckBox cb = (CheckBox) view.findViewById(R.id.cbxList);
						//ContentValues cv = new ContentValues();
						if(cb.isChecked()){
							//String cbxID = "1";
							//cv.put(DB.CBX, cbxID);
							//mDB.updateCbx(cv, cbxID);
							Log.d("phonebookLogs", "   " + getCursor().getInt(mCursor.getColumnIndex(DB.ID)));
						}else{
							Log.d("phonebookLogs", "   сработал else ");
							//String cbxID = "0";
							//cv.put(DB.CBX, cbxID);
							//mDB.updateCbx(cv, cbxID);
						}
					}
				}
			});
		}
		return view;
	}

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Foenix » 13 июл 2014, 22:01

у тебя задача - проапдейтить таблицу, так?
после getCursor().moveToPosition(i);
читай из курсора _id. Затем командой обновляй таблицу где _id равен этой цифре.
а это for(int i = 0; i < getCursor().getCount(); i++){
вообще убери оттудова. зачем там цикл?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Yurets » 14 июл 2014, 01:23

Так цикл для того чтобы перемещаться по записям в курсоре, т.к. у меня не получается напрямую в getCursor().moveToPosition() передать int position, ... если я создаю переменную в том же методе и ставлю её равной position, то мне всегда показывает последнюю запись в listview....
в том и проблема, не знаю как "вынуть" эту position и передать...

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Yurets » 14 июл 2014, 05:25

вроде как работает, только когда нажимаю на элемент listView, а сам чекбокс как пустое место...
В OnItemClick нашёл чекбокс и, как ты и говорила, проапдейтил колонку. а в методе подтверждения удаления просто вызывал метод удалить, где чекбоксы равны 1.
Единственное что ещё сделал, так это поставил для чекбоксов focusable=false, т.к. onItemClick не реагировал)

а можно как-то приравнять "выбор чекбокса" к клику на "элемент списка"? потому что в OnCheckedChanged по прежнему не могу взять position для выбранного элемента...

ВСЁ! Получилось! В методе getView, checkbox-у установил таг с позицией, а в Change слушателе правильно определил чекбокс и его забрал, по позиции нашёл id и удалил.
Спасибо!!


[syntax=java]

Код: Выделить всё

@Override
	public void onItemClick(AdapterView<?> parent, View itemClicked, int position, long id){


		CheckBox cbx = (CheckBox)itemClicked.findViewById(R.id.cbxList);
		cbx.setOnCheckedChangeListener(new OnCheckedChangeListener() {

			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

			}
		});;

		if(cbx.getVisibility() == View.VISIBLE){
			ContentValues cv = new ContentValues();
			if(cbx.isChecked()){
				cbx.setChecked(false);
				int cbxID = 0;
				cv.put(DB.CBX, cbxID);
				mDB.updateCbx(cv, id);
				Log.d(LOG, " updated with id = " + id + " and cbxID is " + cbxID);
			}else{
				cbx.setChecked(true);
				int cbxID = 1;
				cv.put(DB.CBX, cbxID);
				mDB.updateCbx(cv, id);
				Log.d(LOG, " updated with id = " + id + " and cbxID is " + cbxID);
			}

		}else{
			Intent intentContactView = new Intent(this, ContactView.class);
			intentContactView.putExtra("id", id);
			startActivity(intentContactView);
		}		
	}	
[/syntax]

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Foenix » 14 июл 2014, 14:21

хорошо.
я бы вообще делала немного по-другому.
дело в том, что у гугла (если познакомишься с сайтом девелопер) есть режим выбора.
т.е. длинным нажатием ты в него переходишь, затем "выбираешь" айтемы и затем меню на экшенбаре выбираешь действие над этими элементами.
Таким образом удаление нужно было сделать аутентично не чекбоксами, а именно так.
Вместо чекбокса я бы взяла просто картинку, которая в обычном режиме не видна. Затем после долго клика меняем э.б. (там отображается кол-во выбранных элементов) и картинка с галочкой становится видна, выбираем сколько нужно элементов уже короткими кликами (и их картинка с галочкой становится видна) и из э.б. выбираем кнопку "удалить". э.б. меняется на стандартный.
Это очень удобно, красиво и просто.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

Re: Удаление выбранных checkbox-ов внутри listview из БД

Сообщение Yurets » 14 июл 2014, 17:12

да, полностью согласен с тобой, что это далеко не лучший вариант, но задание звучало именно так((
тут, конечно, у людей с фантазией всё ок, это не первая ситуация, где я подзастрял вот так))

Ответить