список с чекбоксами

Интерфейс, диалоги, темы, стили, меню
Ответить
Dimatrof
Сообщения: 9
Зарегистрирован: 14 авг 2012, 19:52
Откуда: Мордовия

список с чекбоксами

Сообщение Dimatrof » 01 окт 2012, 09:56

Сделал список с чекбоксами с помощью LayoutInflater

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

        for (int i=0; i< con.size();i++){
        	View item = ltInflater.inflate(R.layout.item, linLayout, false);
    		TextView tvName = (TextView) item.findViewById(R.id.tvName);
        	CheckBox checkBox1 = (CheckBox) item.findViewById(R.id.checkBox1);
            checkBox1.setText(String.valueOf(con.get(i)));
            item.getLayoutParams().width = LayoutParams.MATCH_PARENT;
            linLayout.addView(item);
        }
как получить массив с выбранными пунктами списка.
Вложения
shot_000009.png
shot_000009.png (46.32 КБ) 11247 просмотров

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: список с чекбоксами

Сообщение rezak90 » 01 окт 2012, 11:47

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

Dimatrof
Сообщения: 9
Зарегистрирован: 14 авг 2012, 19:52
Откуда: Мордовия

Re: список с чекбоксами

Сообщение Dimatrof » 01 окт 2012, 11:57

rezak90 писал(а):в адаптере в getView проверяй и делай что хочешь, например в адаптере создай массив в который записывай все выбранные чекбоксы
я новичек в коддинге для Андроид, можно пример

Dimatrof
Сообщения: 9
Зарегистрирован: 14 авг 2012, 19:52
Откуда: Мордовия

Re: список с чекбоксами

Сообщение Dimatrof » 01 окт 2012, 11:59

Все ок. разобрался http://habrahabr.ru/post/133575/

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: список с чекбоксами

Сообщение Finch » 01 окт 2012, 15:25

Dimatrof, если не новичек в программировании то смотри в сторону design patterns, 6удет проще потом со "ВСЯКИМИ ТАМ АДАПТЕРАМИ" ра6отать =)
CEO of a company R.id.team

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

Re: список с чекбоксами

Сообщение Coment » 04 окт 2012, 14:42

Ладно сдаюсь, неделю промучил данный вопрос изучением разных форумов и топиков (народ таоке с адаптерами и чекбоксами делает, что курить не переккурить). Собсно вопрос: Есть код адаптера который передает в ListView загружаемые картинки. Есть и чекбоксы, и в общем хотелось бы записать в массив строк, чекнутые строки URL которые мы изначально передаем в конструктор адапетра. код прилагается

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

public class LazyAdapter extends BaseAdapter {
     
	private Activity activity;
    private String[] data;
    private static LayoutInflater inflater=null;
    public ImageLoader imageLoader; 
    
    public LazyAdapter(Activity a, String[] d) {
        activity = a;
        data=d;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader=new ImageLoader(activity.getApplicationContext());
    }
..// тут методы адаптера (бал-бла)

 public View getView(int position, View convertView, ViewGroup parent) {
       
..// тут добавляем текст, имейдж и тд.
        
// И вот тут обработка чекбокса
        text.setText(data[position]);
        imageLoader.DisplayImage(data[position], image);
        chkk.setOnCheckedChangeListener(myCheckChangList);
        chkk.setTag(position);
    
        return vi;
    }
    OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
         // тут должно быть что-то важное =)
        }
      };   
}
Так вот правильно ли я понимаю, что можно создать массив String [] mystring и туда передать tag из чебокса? Но как считать количество отмеченных чеков? Или надо создать ArrayList<String> mystring? Каюсь у меня с классами коллекциями пока туговато, потому на данном примере хочу немного подтянуть этот "компонент". Или вобще надо создать отдельный класс Model с конструктором, куда и писать данные. Кто может подскажите примером. Ну пока никак у меня с getTag и setTag. :oops:

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: список с чекбоксами

Сообщение math64 » 04 окт 2012, 15:48

Нужна ещё модель чекбоксов.
У тебя есть String[] data - модель надписей для чекбоксов.
Нужно ещё boolean[] checked - модель выбора чекбокса.
В getView() нужно установить флажок у чекбокса в соответствии с моделью и повесить слушатель, в котором нужно обновлять модель в соответствии с выбором пользователя.
Вместо массивов можно использовать List<String> и List<Boolean> или один List<Model>, где

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

public class Model {
  public String data;
  public boolean checked;
} 

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

Re: список с чекбоксами

Сообщение Coment » 04 окт 2012, 16:10

Спасибо, я сейчас в этом направлении копаю (честно мне уже сниться по ночам списки и слушатели), проблема в том, что класс ImageLoader я честно спионерил (хотя он открыт) и на вход в LazyAdapter идет строго определенны String [] , а ArrayList-ы, то бишь разные Model? бросают ексепшены. Согласен, что все можно переписать, и нужно скорее всего, но дело сейчас идет на время (это все мои проблемы -- понимаю), потому интересует можно ли записать выбранные строки именно в массив строк. К вечеру выложу, то что пока воспринимаю-делаю и возможно совместными усилиями форумчан, выйдет что-то стоящее =)

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: список с чекбоксами

Сообщение rezak90 » 04 окт 2012, 16:16

можно ли записать выбранные строки именно в массив строк
можно
R.id.team
Политика на форуме запрещена

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: список с чекбоксами

Сообщение math64 » 04 окт 2012, 18:05

Для строк можно использовать массив - я просто показал, какие могут быть альтернативные варианты.
Массив строк можно загрузить из ресурса - что тоже удобно.
Списки стоит использовать, если предполагается добавлять и/или удалять элементы из ListView.

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

Re: список с чекбоксами

Сообщение Coment » 07 окт 2012, 22:45

Жесть, прорвало в квартире трубу и вода уничтожила бытовую технику а-ля нетбук и прочее... Вся робота пошла насмарку, а бекапы... были - на нетбуке. Век живи и учись сохраняться. Ладно, это фигня -- интересует другое
rezak90 писал(а):
можно ли записать выбранные строки именно в массив строк
можно
Верно ли я понимаю, что запись строк в массив будет осуществляться посредством цикла? Но как и куда записать количество чеков из списка? Я не прошу написать за меня код, но визуализация псевдо-модели была бы предпочтительна :roll:

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: список с чекбоксами

Сообщение rezak90 » 07 окт 2012, 23:33

Верно ли я понимаю, что запись строк в массив будет осуществляться посредством цикла?
можно и так, но зачем же уродываться, лучше использовать возможности JAVA, а именно списки.
Но как и куда записать количество чеков из списка?
в чекбоксе сделайте обработчик нажатия, по нажатию который будет добавлять в список состояние чекбокса и его текст, но в таком случае лучше наверное использовать Map.
Немножко за мудрено, может быть есть и лучший вариант.
R.id.team
Политика на форуме запрещена

bandik
Сообщения: 7
Зарегистрирован: 06 окт 2012, 04:22

Re: список с чекбоксами

Сообщение bandik » 08 окт 2012, 15:27

Coment писал(а): Верно ли я понимаю, что запись строк в массив будет осуществляться посредством цикла? Но как и куда записать количество чеков из списка? Я не прошу написать за меня код, но визуализация псевдо-модели была бы предпочтительна :roll:
Здравствуйте,
Для простого определения какие из строк выбраны(в каких чекбоксах стоит галочка) могу предложить:
В адаптере в методе getView находите чекбокс и присваиваете ему обработчик нажатия или сметы состояния
В этом обработчике в объект Map записываете состояние чекбокса.

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

private SparseBooleanArray itemChecked;

public MyAdapter(Context context, List<? extends Map<String, ?>> data,
			int resource, String[] from, int[] to) {
		super(context, data, resource, from, to);
		// TODO Auto-generated constructor stub
		...

		itemChecked = new SparseBooleanArray();
		
	}
@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		//Обращаю внимание что стоит FINAL INT POSITION
		//инициализация элементов + объекта который будет возвращаться и тп и тд..
		...

		CheckBox ctv = (CheckBox) view
				.findViewById(R.id.Ваш чекбокс); //находим чекбокс
				// присваиваем чекбоксу
				// обработчик
		ctv.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				//находим чекбокс
				CheckBox chk = (CheckBox) v
						.findViewById(R.id.Ваш чекбокс);

					itemChecked.put(position, chk.isChecked());
			}
		});
		//Следующая строка не обязательна, однако бывают косяки с тем
		//что при скроллинге спика позиции слетают, у меня такого не было
		//но в интеренете много раз встречал что люди жалуются
		//со следующей строчкой никогда ничего не слетит
		ctv.setChecked(itemChecked.get(position));

		return view;
	}
	//метод который будет передовать выбранные позиции
	public SparseBooleanArray Name_Of_your_method()
	{return itemChecked}
С адаптером закончили, вроде ничего не забыл.
теперь в активити, в которой у вас список расположен, в нужном месте(где необходимо получить выбранные
строки) делаем следующие

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


SparseBooleanArray sbArray = ВашАдаптер.Name_Of_your_method();
			
			for (int i = 0; i < sbArray.size(); i++) {
				int key = sbArray.keyAt(i);//получает ключ i'того элемента Мар в объекте sbArray
				
				if (sbArray.get(key))//по ключу получает значение
					//действия если пункт отмечен
				else
					//действия если не отмечен
			}
Подводя итог у вас получился объект Мар который хранит в качестве ключей Позицию списка,
а в качестве значения по этому ключу Отмечен ли чекбокс или нет.

Есть куда проще метод
у списка устанавливаете setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
и используете функцию списка getCheckedItemPositions(), которая возвращает точно такой же объект SparseBooleanArray, как только что я описал вышел. Тоесть никаких действий с адаптером не требуется.
НО тут сразу возникает проблема нажатия на список, так как чекбокс весь фокус на себя забирает и событие нажатия именно на список не происходит. Можно чекбокс заменить на элемент CheckedTextView и тогда функция будет корректно возвращать выбранные пункты списка, НО чекбоксы будут неправильно отмечаться(нажмете на 1 выделится например 6)

Так что рекомендую использовать 1 метод.

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

Re: список с чекбоксами

Сообщение Coment » 12 окт 2012, 19:24

Фухх... Закончил сборку полу рабочего аппарата из того что не сдохло после потопа. Пришлось все переписывать и что я вам скажу... Во-первых спасибо всем кто помогал советами. Искренне -- спасибо. Переписал проект по уроку 54. Все работает!!! Картинки грузятся, чеки запоминают и заполняют ArrayList и тепер я его буду использовать для загрузки полномасштабных картинок и передачи их в Gallery. После пересмотра множества вариантов использования CheckBox и ListView скажу, что вариант урока 54 данного форума для меня наиболее простой (в плане понимания, написания, использования) и приемлемый. Спасибо еще раз всем, автору сайта. Проект еще пишется, потому вопросы еще будут.

Ответить