Страница 1 из 1
список с чекбоксами
Добавлено: 01 окт 2012, 09:56
Dimatrof
Сделал список с чекбоксами с помощью 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);
}
как получить массив с выбранными пунктами списка.
Re: список с чекбоксами
Добавлено: 01 окт 2012, 11:47
rezak90
в адаптере в getView проверяй и делай что хочешь, например в адаптере создай массив в который записывай все выбранные чекбоксы
Re: список с чекбоксами
Добавлено: 01 окт 2012, 11:57
Dimatrof
rezak90 писал(а):в адаптере в getView проверяй и делай что хочешь, например в адаптере создай массив в который записывай все выбранные чекбоксы
я новичек в коддинге для Андроид, можно пример
Re: список с чекбоксами
Добавлено: 01 окт 2012, 11:59
Dimatrof
Re: список с чекбоксами
Добавлено: 01 окт 2012, 15:25
Finch
Dimatrof, если не новичек в программировании то смотри в сторону design patterns, 6удет проще потом со "ВСЯКИМИ ТАМ АДАПТЕРАМИ" ра6отать =)
Re: список с чекбоксами
Добавлено: 04 окт 2012, 14:42
Coment
Ладно сдаюсь, неделю промучил данный вопрос изучением разных форумов и топиков (народ таоке с адаптерами и чекбоксами делает, что курить не переккурить). Собсно вопрос: Есть код адаптера который передает в 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.

Re: список с чекбоксами
Добавлено: 04 окт 2012, 15:48
math64
Нужна ещё модель чекбоксов.
У тебя есть String[] data - модель надписей для чекбоксов.
Нужно ещё boolean[] checked - модель выбора чекбокса.
В getView() нужно установить флажок у чекбокса в соответствии с моделью и повесить слушатель, в котором нужно обновлять модель в соответствии с выбором пользователя.
Вместо массивов можно использовать List<String> и List<Boolean> или один List<Model>, где
Код: Выделить всё
public class Model {
public String data;
public boolean checked;
}
Re: список с чекбоксами
Добавлено: 04 окт 2012, 16:10
Coment
Спасибо, я сейчас в этом направлении копаю (честно мне уже сниться по ночам списки и слушатели), проблема в том, что класс ImageLoader я честно спионерил (хотя он открыт) и на вход в LazyAdapter идет строго определенны String [] , а ArrayList-ы, то бишь разные Model? бросают ексепшены. Согласен, что все можно переписать, и нужно скорее всего, но дело сейчас идет на время (это все мои проблемы -- понимаю), потому интересует можно ли записать выбранные строки именно в массив строк. К вечеру выложу, то что пока воспринимаю-делаю и возможно совместными усилиями форумчан, выйдет что-то стоящее =)
Re: список с чекбоксами
Добавлено: 04 окт 2012, 16:16
rezak90
можно ли записать выбранные строки именно в массив строк
можно
Re: список с чекбоксами
Добавлено: 04 окт 2012, 18:05
math64
Для строк можно использовать массив - я просто показал, какие могут быть альтернативные варианты.
Массив строк можно загрузить из ресурса - что тоже удобно.
Списки стоит использовать, если предполагается добавлять и/или удалять элементы из ListView.
Re: список с чекбоксами
Добавлено: 07 окт 2012, 22:45
Coment
Жесть, прорвало в квартире трубу и вода уничтожила бытовую технику а-ля нетбук и прочее... Вся робота пошла насмарку, а бекапы... были - на нетбуке. Век живи и учись сохраняться. Ладно, это фигня -- интересует другое
rezak90 писал(а):можно ли записать выбранные строки именно в массив строк
можно
Верно ли я понимаю, что запись строк в массив будет осуществляться посредством цикла? Но как и куда записать количество чеков из списка? Я не прошу написать за меня код, но визуализация псевдо-модели была бы предпочтительна

Re: список с чекбоксами
Добавлено: 07 окт 2012, 23:33
rezak90
Верно ли я понимаю, что запись строк в массив будет осуществляться посредством цикла?
можно и так, но зачем же уродываться, лучше использовать возможности JAVA, а именно списки.
Но как и куда записать количество чеков из списка?
в чекбоксе сделайте обработчик нажатия, по нажатию который будет добавлять в список состояние чекбокса и его текст, но в таком случае лучше наверное использовать Map.
Немножко за мудрено, может быть есть и лучший вариант.
Re: список с чекбоксами
Добавлено: 08 окт 2012, 15:27
bandik
Coment писал(а):
Верно ли я понимаю, что запись строк в массив будет осуществляться посредством цикла? Но как и куда записать количество чеков из списка? Я не прошу написать за меня код, но визуализация псевдо-модели была бы предпочтительна

Здравствуйте,
Для простого определения какие из строк выбраны(в каких чекбоксах стоит галочка) могу предложить:
В адаптере в методе 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 метод.
Re: список с чекбоксами
Добавлено: 12 окт 2012, 19:24
Coment
Фухх... Закончил сборку полу рабочего аппарата из того что не сдохло после потопа. Пришлось все переписывать и что я вам скажу... Во-первых спасибо всем кто помогал советами. Искренне -- спасибо. Переписал проект по уроку 54. Все работает!!! Картинки грузятся, чеки запоминают и заполняют ArrayList и тепер я его буду использовать для загрузки полномасштабных картинок и передачи их в Gallery. После пересмотра множества вариантов использования CheckBox и ListView скажу, что вариант урока 54 данного форума для меня наиболее простой (в плане понимания, написания, использования) и приемлемый. Спасибо еще раз всем, автору сайта. Проект еще пишется, потому вопросы еще будут.