Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
BigOblom
118 / 118 / 7
Регистрация: 30.06.2010
Сообщений: 435
#1

Привязка класса к ArrayAdapter - Программирование Android

05.01.2015, 14:09. Просмотров 523. Ответов 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, то получил ошибку, которую не смог побороть.
Наверное мне нужно другое решение?

Хелп)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2015, 14:09     Привязка класса к ArrayAdapter
Посмотрите здесь:

Собственный ArrayAdapter - Программирование Android
Доброго времени суток. Пытаюсь написать собственный адаптер для строкового типа: titles = new ArrayList&lt;String&gt;(messages.size());...

ACTION_SEND в ArrayAdapter - Программирование Android
Ребят,вопрос такой, есть GridView с картинками, к нему отдельным классом подключен Adapter. Необходимо по клику картинки делать ACTON_SEND....

Отличия в работе ArrayAdapter - Программирование Android
Что то не понятное с ArrayAdapter на Android 2.3, У меня есть EditText в списке, меняя значение одного, меняются все. На Android &gt;= 4.0 все...

ArrayAdapter и много заморочек - Программирование Android
Сам ArrayAdapter String data = new String{&quot;Текст 1&quot;,&quot;Текст 2&quot;}; ArrayAdapter&lt;String&gt; adapter = new ArrayAdapter&lt;&gt;(this, ...

Обновление данных в ArrayAdapter - Программирование Android
Добрый день. Есть созданный ArrayAdapter. Он добавляется в listView, при достижении конца списка происходит получение информации и...

Собственный адаптер на основе ArrayAdapter - Программирование Android
Хочу реализовать, чтобы при keydown элемент списка менял цвет фона, а при keyup возвращался в исходное положение, и в то же время выполнял...

Кастомный ArrayAdapter для Spinner - Программирование Android
Создал свой адаптер. Привязал его к списку Spinner. Получил идентификатор выбранной записи. Ну вроде бы как получается в каждом элементе...

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



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



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

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



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

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

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

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

Я посмотрел про Expandablelistview, там же все на одном экране сгруппировано по группам, нажимаешь группу, выпадает список элементов этой группы.
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
05.01.2015, 21:27     Привязка класса к ArrayAdapter #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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().


Вот как-то так =)
BigOblom
118 / 118 / 7
Регистрация: 30.06.2010
Сообщений: 435
06.01.2015, 18:04  [ТС]     Привязка класса к ArrayAdapter #7
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;
        }
 
 
 
    }
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
06.01.2015, 21:02     Привязка класса к ArrayAdapter #8
Цитата Сообщение от BigOblom Посмотреть сообщение
подчеркивает метод getActivity() красным. Посмотрел в примерах, он используется везде в Fragment. У меня фрагментов нету. Может из-за этого?

Ну да. Context передайте значит, через который LayoutInflater получаете.
BigOblom
118 / 118 / 7
Регистрация: 30.06.2010
Сообщений: 435
11.01.2015, 10:32  [ТС]     Привязка класса к ArrayAdapter #9
Sony17, у меня в listview список checkbox. Я в него передаю только названия, а ид беру получается как номер в списке. Как то можно передавать в checkbox с текстом еще и его ид из list.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2015, 15:35     Привязка класса к ArrayAdapter
Еще ссылки по теме:

ArrayAdapter вылет на clear и add - Программирование Android
Приветствую! Вылет на clear. Если эту строку закоментить то вылет на add. В чем может быть проблема? import java.io.File; ...

Как правильно настроить ArrayAdapter? - Программирование Android
Создаю своё первое приложение, потому вопрос новичка. Статья, которой я руководствовался - поверхностная, потому во многом пришлось...

Выкидывает NullPointerException при заполнении данных через ArrayAdapter - Программирование Android
Заполняю данные из массива Food.foods с помощью ArrayAdapter в ListView макета activity_food_category.xml. При заполнении выкидывает ошибку...

Класс: Хочу из класса WorkFiles получить доступ к функционалу класса WorkDB. - Программирование Android
Есть 3 класса: MainActivity, WorkDB и WorkFiles. Хочу из класса WorkFiles получить доступ к функционалу класса WorkDB. Файл...

Привязка веб интерфейса - Программирование Android
Попробую более точно описать что мне нужно... Вот у меня например есть веб интерфейс для управления каким то прибором, например светом в...


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

Или воспользуйтесь поиском по форуму:
Sony17
28 / 28 / 6
Регистрация: 24.05.2013
Сообщений: 157
11.01.2015, 15:35     Привязка класса к ArrayAdapter #10
Цитата Сообщение от BigOblom Посмотреть сообщение
Я в него передаю только названия, а ид беру получается как номер в списке
Ну не правильно. Передавать нужно не название/id/что-то еще, а конкретный объект(PollsVariables я так понимаю), который содержит в себе все это. И тогда через этот объект получаете все что нужно и передаете в чекбокс или куда-то еще.

Или вопрос конкретно про то, как чекбоксу присвоить id ответа? Как и у любой View, у чекбокса есть Tag. Записывайте туда setTag(id) и получайте при необходимости getTag().
Yandex
Объявления
11.01.2015, 15:35     Привязка класса к ArrayAdapter
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru