Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478

Привязка класса к ArrayAdapter

05.01.2015, 14:09. Показов 1319. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть класс, содержащий опросы
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
private static class Polls {
        private final int _Id;
        private final String _Name;
        private final String _Question;
        private final String[] _Variables;
 
        private Polls(int id, String name, String question, String[] variables) {
            _Id = id;
            _Name = name;
            _Question = question;
            _Variables = variables;
        }
}
Вот так заполняю
Java
1
2
3
4
5
6
7
8
9
10
11
12
private static final List<Polls> polls = new ArrayList<>();
 
static {
        polls.add(new Polls(1, "Велосипеды", "Сколько вы готовы потратить на велосипед?", 
                new String[]{"До 5 000 руб", "От 5 000 до 10 000 руб", "От 10 000 до 15 000 руб", "Более 15 000 руб"}));
        polls.add(new Polls(2, "Здоровье", "Как часто вы обращаетесь к доктору?", 
                new String[]{"Раз в неделю", "Раз в месяц", "Несколько раз в месяц", "Раз в год", "Несколько раз в год"}));
        polls.add(new Polls(3, "Животные", "Какое у вас домашнее животное?", 
                new String[]{"Кот/Кошка", "Собака", "Попугай", "Свинья", "Обезъянка", "Младший брат"}));
        polls.add(new Polls(4, "Хобби", "Ваше хобби имеет сидячий или подвижный образ?", 
                new String[]{"Сидячий", "Активный", "50 на 50", "У меня нет хобби"}));
}
Есть активити с ListView, в который нужно выводить список тем опросов, по клику на опрос открывается новое активити с ListView и загружается сам вопрос, варианты ответов и кнопка, по которой помеченные ответы записываются в класс.

Собственно сижу туплю, как это сделать)
Написал сюда из принципа: "Чтобы решить проблему, расскажи ее кому-нибудь так, чтобы он понял".

Все это дело сделал через переопределение метода getView ArrayAdapter.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private class PollsAdapter extends ArrayAdapter<Polls> {
 
        public PollsAdapter (Context context){
            super(context, android.R.layout.simple_list_item_1, polls);
        }
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Polls poll = getItem(position);
 
            if(convertView == null){
                convertView = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_list_item_2, null);
            }
            ((TextView)convertView.findViewById(android.R.id.text1)).setText(poll._Name);
            return convertView;
        }
}
Когда решил сделать обработчик клика на item, то получил ошибку, которую не смог побороть.
Наверное мне нужно другое решение?

Хелп)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.01.2015, 14:09
Ответы с готовыми решениями:

Привязка к свойству класса
Приветствую, ребята! Подскажите пожалуйста, как сделать привязку элемента к свойству класса? Т.е. есть некий класс (ViewModel), в нем есть...

Привязка массива из класса
Никак не могу решить проблему. Есть класс public class ABC { public int id { get; set; } ...

Привязка элемента к переменной класса
Никак не получается привязаться к переменной класса, чтобы при изменении переменной изменялся бы и элемент. Что не так? public...

9
28 / 28 / 10
Регистрация: 24.05.2013
Сообщений: 157
05.01.2015, 14:33
Цитата Сообщение от BigOblom Посмотреть сообщение
помеченные ответы записываются в класс.
Это вообще как? Может в коллекцию, которая в этом классе объявлена?



Цитата Сообщение от BigOblom Посмотреть сообщение
Все это дело сделал через переопределение метода getView ArrayAdapter.
Если в списке используется только один UI элемент - TextView, да тем более разметка для него стандартная идет, то класс PollsAdapter лишний. Он тут совершенно не нужен.



Цитата Сообщение от BigOblom Посмотреть сообщение
Когда решил сделать обработчик клика на item, то получил ошибку, которую не смог побороть.
Ну сам код бы посмотреть, да ошибку эту..

Если хотите открыть Activity из класса A, выбрать там ответы и записать их в коллекцию, которая объявлена в классе A, то используйте startActivityForResult() для запуска Activity, ну и onActivityResult(), чтобы получить данные и записать их в коллекцию.



Ну а вообще, не лучше ли использовать Expandablelistview?
1
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
05.01.2015, 16:06  [ТС]
Sony17, Ну да, в коллекцию.
Цитата Сообщение от Sony17 Посмотреть сообщение
Если в списке используется только один UI элемент - TextView, да тем более разметка для него стандартная идет, то класс PollsAdapter лишний. Он тут совершенно не нужен.
Да я по примеру делал, вот в конце понял что лишнее сделал.
Цитата Сообщение от Sony17 Посмотреть сообщение
Ну сам код бы посмотреть, да ошибку эту..
Да я решил отказаться от этого способа с перегрузкой getView.

Цитата Сообщение от Sony17 Посмотреть сообщение
используйте startActivityForResult() для запуска Activity, ну и onActivityResult(), чтобы получить данные и записать их в коллекцию.
Спасибо, сейчас гляну что за зверь.

Цитата Сообщение от Sony17 Посмотреть сообщение
Ну а вообще, не лучше ли использовать Expandablelistview?
Сейчас посмотрю для чего он и как используется. Если не сложно, можно пример, я про него вообще первый раз слышу.
0
28 / 28 / 10
Регистрация: 24.05.2013
Сообщений: 157
05.01.2015, 18:00
Цитата Сообщение от BigOblom Посмотреть сообщение
Сейчас посмотрю для чего он и как используется. Если не сложно, можно пример, я про него вообще первый раз слышу.

Аналогично как и с обычным списком. Методов для переопределения только побольше. Во пример хороший: http://androidexample.com/Cust... 7&aaid=129
0
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
05.01.2015, 19:22  [ТС]
Sony17, Вы меня наверное не совсем поняли.
1 Экран - Список тем опросов, при выборе =>
2 Экран - Конкретный вопрос с вариантами ответа, при нажатии кнопки готово =>
3 Экран - С результатами и кнопкой вернутся к списку опросов.

Я посмотрел про Expandablelistview, там же все на одном экране сгруппировано по группам, нажимаешь группу, выпадает список элементов этой группы.
0
28 / 28 / 10
Регистрация: 24.05.2013
Сообщений: 157
05.01.2015, 21:27
Лучший ответ Сообщение было отмечено BigOblom как решение

Решение

Цитата Сообщение от BigOblom Посмотреть сообщение
1 Экран - Список тем опросов, при выборе =>
Грубо говоря, каждый элемент списка - опрос(Polls). При нажатии на элемент списка, получаете этот опрос. Для этого, все же наверное лучше создать класс, наследоваться от адаптера, переопределить метод getView() и для View(разметка элементов списка), которую возвращает метод getView(), методом setTag(currentPolls) добавить опрос. Примерно так:

Java
1
2
3
4
5
6
7
@Override
public View getView(int position, View convertView, ViewGroup parent) {
      view = inflater.inflate(R.layout.pollsList, null);
      ...
      view.setTag(polls); // polls - опрос для текущего элемента списка
      return view;
}
Когда пользователь выбирает элемент списка, нужно этот опрос получить и открыть 2 Экран, передав туда выбранный опрос. Примерно так:

Java
1
2
3
4
5
Polls polls = (Polls) v.getTag(); // v - та самая view из кода выше; 
                                               во всех 'кликабельных' слушателях она есть(напр. onClick(View v))
Intent intent = new Intent(getActivity(), 2 Экран.class);
intent.putExtra("Key", polls);
startActivity(intent);
Важно! Класс Polls должен реализовывать интерфейс Serializable:

Java
1
public class Polls implements Serializable



Цитата Сообщение от BigOblom Посмотреть сообщение
2 Экран - Конкретный вопрос с вариантами ответа, при нажатии кнопки готово =>
в методе onCreateView() ловим отправленный ранее intent:

Java
1
2
Intent intent = getIntent();
final Polls polls = (Polls) intent.getSerializableExtra("Key");
Получили выбранный пользователем опрос и делайте с ним, что хотите.

Я бы переписал Ваш класс Polls. С точки зрения объектно-ориентированного программирования он не совсем правилен. Опрос - это один объект, вопрос - другой объект. Т.к. без опроса, вопросов быть не может, то внутри класса Polls я бы создал еще один внутренний класс Question. А в классе Polls создал бы коллекцию ArrayList<Question>, которая хранила бы все вопросы текущего опроса. А сами вопросы создавать/получать традиционно через методы set/get класса Polls.
Тогда во 2 Экран'е, через полученный Polls, можно получить коллекцию вопросов (для этого внутренний класс Question должен быть public, чтобы можно было приводить к типу элементу коллекции), а дальше все делать по аналогии с первым пунктом.




Цитата Сообщение от BigOblom Посмотреть сообщение
3 Экран - С результатами и кнопкой вернутся к списку опросов.
Про кнопку не понял.
Так это третий Activity или первый? Если третий, то по сути, все опять же аналогично предыдущим пунктам: получили intent, вытащили из него опросы/вопросы и делаете с ними что хотите. Если первый, то как уже говорил, через методы startActivityForResult() и onActivityResult().


Вот как-то так =)
1
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
06.01.2015, 18:04  [ТС]
Sony17, спасибо огромное. Сижу перевариваю) По поводу двух классов, у меня раньше ведь так и было. Потом чёрт дернул сделать все в один.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private static class Polls {
        private final int _Id;
        private final String _Name;
 
        private Polls(int id, String name) {
            _Id = id;
            _Name = name;
        }
    }
 
    private static class PollsVariables {
        private final int _Id;
        private final String _Title;
        private final String[] _Names;
 
        private PollsVariables(int id, String title, String[] names) {
            _Id = id;
            _Title = title;
            _Names = names;
        }
    }
Добавлено через 10 минут
Цитата Сообщение от Sony17 Посмотреть сообщение
Так это третий Activity или первый?
Это третий активити, туда я планирую сделать результаты опроса в виде диаграммы и кнопку "Опросы", по нажатию на которую возвращаешься обратно к списку опросов. Ну и еще вторую кнопку "Опубликовать в Facebook", правда не знаю насколько сложно это будет реализовать, как и диаграмму.

Добавлено через 20 часов 23 минуты
Sony17, подчеркивает метод getActivity() красным. Посмотрел в примерах, он используется везде в Fragment. У меня фрагментов нету. Может из-за этого?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class PollsAdapter extends ArrayAdapter<Polls> {
 
        public PollsAdapter (Context context){
            super(context, android.R.layout.simple_list_item_1, polls);
        }
 
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Polls poll = getItem(position);
 
            if(convertView == null){
                convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_polls, null);
            }
            TextView tvPoll = (TextView)convertView.findViewById(R.id.tvPoll);
            tvPoll.setText(poll._Name);
 
            convertView.setOnClickListener( new View.OnClickListener() {
 
                @Override
                public void onClick(View v) {
                    Polls polls = (Polls)v.getTag();
                    Intent intent = new Intent(getActivity(), QuestionsActivity.class);
                }
            });
 
            convertView.setTag(polls);
 
            return convertView;
        }
 
 
 
    }
0
28 / 28 / 10
Регистрация: 24.05.2013
Сообщений: 157
06.01.2015, 21:02
Цитата Сообщение от BigOblom Посмотреть сообщение
подчеркивает метод getActivity() красным. Посмотрел в примерах, он используется везде в Fragment. У меня фрагментов нету. Может из-за этого?

Ну да. Context передайте значит, через который LayoutInflater получаете.
0
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
11.01.2015, 10:32  [ТС]
Sony17, у меня в listview список checkbox. Я в него передаю только названия, а ид беру получается как номер в списке. Как то можно передавать в checkbox с текстом еще и его ид из list.
0
28 / 28 / 10
Регистрация: 24.05.2013
Сообщений: 157
11.01.2015, 15:35
Цитата Сообщение от BigOblom Посмотреть сообщение
Я в него передаю только названия, а ид беру получается как номер в списке
Ну не правильно. Передавать нужно не название/id/что-то еще, а конкретный объект(PollsVariables я так понимаю), который содержит в себе все это. И тогда через этот объект получаете все что нужно и передаете в чекбокс или куда-то еще.

Или вопрос конкретно про то, как чекбоксу присвоить id ответа? Как и у любой View, у чекбокса есть Tag. Записывайте туда setTag(id) и получайте при необходимости getTag().
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.01.2015, 15:35
Помогаю со студенческими работами здесь

Привязка класса к команде XML
Добрый день. Имеется задание: Делать его за меня не прошу. Просто мне непонятно как задать это самое соответствие между...

Привязка обработчика из другого класса
Доброго вечера, форумчане! Есть такая проблемка: в моём проекте есть несколько форм, у каждой формы есть свои обработчики событий. В...

Привязка данных своего класса
Необходимо привязать данные из моего класса (а точнее списка объектов класса либо структур) к элементу ListBox Допустим, есть список...

Привязка одного из полей класса к TextBox
Здравствуйте. Такие дела: Класс человек. Допустим, у него пока только имя. public class Person { string Name; ...

Привязка полей БД не ко всем свойствам класса
Есть класс-модель: public class Phone { public int Id { get; set; } public string Title { get; set; } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru