Урок 54. Кастомизация списка. Создаем свой адаптер

Обсуждение уроков
Аватара пользователя
Kirill
Сообщения: 19
Зарегистрирован: 09 сен 2015, 13:53

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Kirill » 09 сен 2015, 13:57

damager82 писал(а):
elron писал(а):Не знаю критично для кого-то или нет, но в "MainActivity.java" -> "public void showResult(View v)" -> строка "if (p.box)" не нужна, т.к. проверка уже была в "BoxAdapter.java" -> "ArrayList<Product> getBox()".
Да, в моем примере это лишняя проверка.
Не поленился зарегистрироваться на форуме чтобы, как настоящий зануда, указать на это, а тут уже до меня обнаружили :D
еще раз спасибо за урок

если кому интересно - ссылка на статью почему следует использовать именно кастомный base adapter http://www.piwai.info/android-adapter-good-practices/

O6e36ashenII
Сообщения: 4
Зарегистрирован: 17 сен 2015, 12:29

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение O6e36ashenII » 17 сен 2015, 12:42

Доброго дня всем.
Опыта у меня не много поэтому и куча проблем.
Задача у меня такая. При нажатии на элемент из ListView менять его ROW на другой. в принципе все понятно и для 1 элемента я сделал, по тестил, все короче круто. Проанализировал код и выяснил что при нажатии он проверяет нажатую позицию и меняет row, и при нажатии на другой элемент, возвращает 1-ый в начальное состояния и меняет второй. Так вот как сделать весь список row-заменяемым.
Чтобы при нажатии на следующий элемент, предыдущий не менялся в начальное состояние .
Кусочки кода

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

 public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        holder= new ViewHolder();
        int type = getItemViewType(position);
        ChildrensState item = (ChildrensState) getItem(position);
        if(convertView==null)
        {
            switch (type) {
                case IS_END_ANSWER:
                    convertView=cInflater.inflate(R.layout.lesson_children_adapter_lesson, parent,false);
                    holder.name = (TextView) convertView.findViewById(R.id.childrens_textView_lessons);
                    holder.averageMark = (TextView) convertView.findViewById(R.id.lesson_averagemark_textView);
                    holder.absenceChildrens = (CheckBox) convertView.findViewById(R.id.lesson_absencechildrens_checkBox);
                    convertView.setTag(holder);
                    break;
                case IS_START_ANSWER:
                    convertView=cInflater.inflate(R.layout.lesson_children_adapter_answer, parent,false);
                    holder.name = (TextView)convertView.findViewById(R.id.childrens_textView_answer);
                    convertView.setTag(holder);
                    break;
            }

        }
        else {
            holder= (ViewHolder) convertView.getTag();
        }
и Main Activity

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

lvChildrensState.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
nsState.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                mSelectedItem = position;
                childrensStateAdapter.setSelect(mSelectedItem);
                childrensStateAdapter.notifyDataSetChanged();
                Toast.makeText(getApplicationContext(), "LongClick" + mSelectedItem, Toast.LENGTH_SHORT).show();
            }
        });
Не ясно как хранить правильно нажатые элементы. дайте подсказку.

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

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 17 сен 2015, 13:25

чтобы все сохранялось (я не поняла что ты там "меняешь на другой raw" но это не важно) нужно при нажатии сохранять это в ДАННЫХ, откуда листвью берет инфу для показа.
В уроках это было.
А у тебя setSelect - это чисто показ. В данных, например в POJO должен быть флаг isSelected, например, который ты будешь выставлять в true или false , а так же брать эту инфу в getView для показа.
R.id.team

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

O6e36ashenII
Сообщения: 4
Зарегистрирован: 17 сен 2015, 12:29

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение O6e36ashenII » 17 сен 2015, 14:12

Феникс, поздравляю с 4000-ым сообщением.
А по теме. Я знаю что setSelected это для показа. просто надо было наверно немного код отредактировать, чтобы правильнее задать вопрос.
По иерархии у меня базовый класс ChildrensState. В нём как раз ArrayList. В ChildrensStateAdapter уже сам адаптер для Listview.
Сам же ListView это часть экрана в Activty. Поэтому в нём я создаю адаптер.

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

public void getChildrens(String response){
        final ChildrensState childrenState = new ChildrensState();
        childrensStateArray = childrenState.getChildrenState(response);
        childrensStateAdapter = new ChildrensStateAdapter(getApplicationContext(),childrensStateArray);
        lvChildrensState = (ListView) findViewById(R.id.childrenlist);
        lvChildrensState.setAdapter(childrensStateAdapter);
        lvChildrensState.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        lvChildrensState.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                childrensStateAdapter.toggleSelection(position);
                childrensStateAdapter.notifyDataSetChanged();
            }
        });

    }
Я правильно понимаю что флаг должен быть в ChildrensState классе. и сохранять состояние в том же ArrayListe класса.
Может все же кодиком поможете, ибо ну не могу я сложить все это по полочкам в голове. Ведь я только учусь(В смысле не волшебник я ещё ).

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

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 17 сен 2015, 17:18

Ну да, там должен, ты читай уроки, было же там что то про корзину покупок, что ли
R.id.team

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

O6e36ashenII
Сообщения: 4
Зарегистрирован: 17 сен 2015, 12:29

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение O6e36ashenII » 17 сен 2015, 20:24

Я этот урок уже наизусть выучил. Уже перелопатил весь интернет. Нет сил уже .
Я уже с лёгкостью в 4-ёх вариант могу написать код для выбора 1 элемента из списка. А вот как сделать так чтобы все выбранные элементы подсвечивались не могу и все. Может все же хоть схемку накинете, я уж дальше постараюсь из-за всех сил .... :cry:

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение doter.ua » 17 сен 2015, 20:53

O6e36ashenII писал(а):Я этот урок уже наизусть выучил. Уже перелопатил весь интернет. Нет сил уже .
Я уже с лёгкостью в 4-ёх вариант могу написать код для выбора 1 элемента из списка. А вот как сделать так чтобы все выбранные элементы подсвечивались не могу и все. Может все же хоть схемку накинете, я уж дальше постараюсь из-за всех сил .... :cry:
ArrayAdapter<MyClass>, где в MyClass помимо инфы будет булка isChecked.
Адаптер в гетВью некоторые свойства "рисует" в зависимости от булки:

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

if( item.isChecked() ){
   // синий фон
} else {
   // белый фон
}
Так же в адаптере можно повесить ОнКлик(){
item.setIsChecked( !item.isChecked() );
}
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

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

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 18 сен 2015, 00:57

Как говорится ты угадал все буквы, но не смог прочесть слово
R.id.team

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

AndreiMaxx
Сообщения: 9
Зарегистрирован: 15 окт 2015, 15:14

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение AndreiMaxx » 15 окт 2015, 15:22

Подскажите пожалуйста как поменять строчку for (Product p : boxAdapter.getBox()) на более понятный
метод типо for (int i = 0; boxAdapter.size(); i++) и т.д. Я примерно понимаю что она и как делает, но не понимаю как ее можно переделать, перепробовал кучу способов все равно не выходит. Спасибо заранее.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение doter.ua » 15 окт 2015, 16:23

ArrayList<Product> list = boxAdapter.getBox();
for (int i = 0; i < list.size(); i++){
//todo list.get(i)
}
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

AndreiMaxx
Сообщения: 9
Зарегистрирован: 15 окт 2015, 15:14

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение AndreiMaxx » 16 окт 2015, 11:28

Спасибо, все доступно и понятно )))

lenny1000
Сообщения: 3
Зарегистрирован: 16 окт 2015, 12:40

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение lenny1000 » 16 окт 2015, 12:53

Когда делал урок в Андроид студио возник такой вопрос: я делал проект по памяти и в методе
public View getView(int position, View convertView, ViewGroup parent)
при заполнение чекбокса возникла такая ситуация. Изначально я заполнил последний кусок кода так:

CheckBox cb = (CheckBox) view.findViewById(R.id.cbCheck);

cb.setChecked(p.box);
cb.setTag(position);
cb.setOnCheckedChangeListener(cbListener);

При таком заполнении оно не сохраняет галку в чекбоксе при прокрутке. Но если порядок команд поменять на такой(как собственно сделано в уроке):

CheckBox cb = (CheckBox) view.findViewById(R.id.cbCheck);

cb.setTag(position);
cb.setOnCheckedChangeListener(cbListener);
cb.setChecked(p.box);

то все работает отлично. Я менял местами эти 3 команды и пришел к выводу что важно что-бы setTag было до setChecked иначе галка будет теряться при прокрутке. Может кто-то пожалуйста кто-то объяснить почему он работает именно так. Весь остальной код соответствует коду урока.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение doter.ua » 16 окт 2015, 13:26

lenny1000 писал(а):Когда делал урок в Андроид студио возник такой вопрос: я делал проект по памяти и в методе
public View getView(int position, View convertView, ViewGroup parent)
при заполнение чекбокса возникла такая ситуация. Изначально я заполнил последний кусок кода так:

CheckBox cb = (CheckBox) view.findViewById(R.id.cbCheck);

cb.setChecked(p.box);
cb.setTag(position);
cb.setOnCheckedChangeListener(cbListener);

При таком заполнении оно не сохраняет галку в чекбоксе при прокрутке. Но если порядок команд поменять на такой(как собственно сделано в уроке):

CheckBox cb = (CheckBox) view.findViewById(R.id.cbCheck);

cb.setTag(position);
cb.setOnCheckedChangeListener(cbListener);
cb.setChecked(p.box);

то все работает отлично. Я менял местами эти 3 команды и пришел к выводу что важно что-бы setTag было до setChecked иначе галка будет теряться при прокрутке. Может кто-то пожалуйста кто-то объяснить почему он работает именно так. Весь остальной код соответствует коду урока.

При создании обработчика cb.setOnCheckedChangeListener(cbListener); позиция берется из тега. Вообще я бы сделал просто new On...Listener не вынося обработчик из метода гетВью, код будет более громоздкий, но костыли с тегом еще хуже.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

lenny1000
Сообщения: 3
Зарегистрирован: 16 окт 2015, 12:40

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение lenny1000 » 16 окт 2015, 13:44

doter.ua писал(а):
lenny1000 писал(а):Когда делал урок в Андроид студио возник такой вопрос: я делал проект по памяти и в методе
public View getView(int position, View convertView, ViewGroup parent)
при заполнение чекбокса возникла такая ситуация. Изначально я заполнил последний кусок кода так:

CheckBox cb = (CheckBox) view.findViewById(R.id.cbCheck);

cb.setChecked(p.box);
cb.setTag(position);
cb.setOnCheckedChangeListener(cbListener);

При таком заполнении оно не сохраняет галку в чекбоксе при прокрутке. Но если порядок команд поменять на такой(как собственно сделано в уроке):

CheckBox cb = (CheckBox) view.findViewById(R.id.cbCheck);

cb.setTag(position);
cb.setOnCheckedChangeListener(cbListener);
cb.setChecked(p.box);

то все работает отлично. Я менял местами эти 3 команды и пришел к выводу что важно что-бы setTag было до setChecked иначе галка будет теряться при прокрутке. Может кто-то пожалуйста кто-то объяснить почему он работает именно так. Весь остальной код соответствует коду урока.

При создании обработчика cb.setOnCheckedChangeListener(cbListener); позиция берется из тега. Вообще я бы сделал просто new On...Listener не вынося обработчик из метода гетВью, код будет более громоздкий, но костыли с тегом еще хуже.
Я понимаю что она берется из тега, но порядок того, когда вешать обработчик вообще не важен (я пробовал и в самом начале, и в конце и тд.) Важно чтобы setTag было перед setChecked иначе оно не работает. Я этого не могу понять.
А вешать тег можно и после обработчика...

AndreiMaxx
Сообщения: 9
Зарегистрирован: 15 окт 2015, 15:14

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение AndreiMaxx » 16 окт 2015, 14:20

Здравствуйте, у меня задача сделать два окна в одном открывается список с checkbox(все как у вас по уроку), юзер кликает на checkbox переходит во второе окно где уже открывается новый список с тем что он выбрал. У себя сделал так, первое окно передает во второй массив в котором записывает порядковый номер строки в Listview на котором стоит галочка, а второе окно загружает позицию того же массива. Все работает, хотя по мне кода многовато. Подскажите пожалуйста советом, если вам не трудно, как лучше сохранить выбранные значения, чтобы при выходе из приложения они не обнулялись ?

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

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 17 окт 2015, 21:57

читай уроки о хранении данных
R.id.team

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

AndreiMaxx
Сообщения: 9
Зарегистрирован: 15 окт 2015, 15:14

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение AndreiMaxx » 18 окт 2015, 04:44

Ок, спасибо за такой ответ, хотя я так понимаю это универсальный совет всем, когда сам не знаешь как. Ну да ладно попытаюсь сузить вопрос: я сохраняю массив чисел тех позиций которые отметил юзер в sharedpreference. Во вторую активность отправляю значения с помощью Bundle и putIntArray, там уже делаю проверку если Bundle не пустой то запускаю адаптер, а так как тут тоже надо сохранять значения то у меня два метода. Первый метод эти значения записывает как только получает данные из Main и так же вставляет в адаптер, а второй их воспроизводит при повторном входе в приложение и тоже вставляет в адаптер. Вот тут у меня возникла дилемма, так как оба метода находятся после setContentView и вставляют данные в адаптер, я не знаю как их научить понимать, что если один сработал, то второй не должен срабатывать и наоборот... Если кто то понял, что я пытаюсь спросить и знает как это сделать спасибо за ранее.

Night_Scream
Сообщения: 54
Зарегистрирован: 23 сен 2013, 10:51

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Night_Scream » 04 ноя 2015, 15:20

Как сделать событие клика по item, чекбокс мне не нужен при этом?

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение GRAF_COLLIOSTRO » 22 ноя 2015, 11:02

Ребят, тема актуальна( в getView повешал слушалку:

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

view.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Log.d(LOG_TAG, "жмафффк");
        });
в логах срабатывает. всё замечательно. только один момент: отсюда из адаптера не могу выполнить startActivity
у меня нет кнопки корзины, как в уроке. я хочу по нажатию на пункте уходить на другую активность.

пробовал так:

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

Intent intent = new Intent(ctx, INFO.class);
startActivity(intent);
- ошибка. говорит startActivity cannot resolve method.

подскажите, как обработать это нажатие? или как в активити отловить событие нажатия?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение doter.ua » 22 ноя 2015, 13:40

GRAF_COLLIOSTRO писал(а):Ребят, тема актуальна( в getView повешал слушалку:

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

view.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Log.d(LOG_TAG, "жмафффк");
        });
в логах срабатывает. всё замечательно. только один момент: отсюда из адаптера не могу выполнить startActivity
у меня нет кнопки корзины, как в уроке. я хочу по нажатию на пункте уходить на другую активность.

пробовал так:

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

Intent intent = new Intent(ctx, INFO.class);
startActivity(intent);
- ошибка. говорит startActivity cannot resolve method.

подскажите, как обработать это нажатие? или как в активити отловить событие нажатия?
Попробуй ctx.startActivity
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Ответить