С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
3 / 2 / 2
Регистрация: 21.03.2017
Сообщений: 297

Обратная передача данных в ListView

25.01.2018, 06:55. Показов 1471. Ответов 4

Студворк — интернет-сервис помощи студентам
Почему-то в ListView не работает привязка данных: входные данные отображаются правильно, а вот то, что выбрал пользователь не фиксируется в адаптере.
Вот такая разметка передаётся в ListView:
XML
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.AppCompatCheckBox
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/checkBox"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"/>
Вот класс одного элемента списка:
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
public class RepeatListItem {
 
    private boolean mIsChecked;
    public void setIsChecked(final boolean isChecked){
        mIsChecked = isChecked;
    }
    public boolean getIsChecked() {
        return mIsChecked;
    }
 
    private String mName;
    public void setName(final String name){
        mName = name;
    }
    public String getName() {
        return mName;
    }
 
    public RepeatListItem() {}
 
    public RepeatListItem(final String name, final boolean isChecked){
        mName = name;
        mIsChecked = isChecked;
    }
}
Вот так делаю привязку разметки к адаптеру:
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
public class RepeatListAdapter extends ArrayAdapter<RepeatListItem> {
 
    private LayoutInflater mInflater;
    private int mLayout;
    private List<RepeatListItem> mRepeats;
 
    public RepeatListAdapter(@NonNull final Context context, final int resource, final List<RepeatListItem> repeat) {
        super(context, resource, repeat);
        mRepeats = repeat;
        mLayout = resource;
        mInflater = LayoutInflater.from(context);
    }
 
    public View getView(int position, View convertView, ViewGroup parent) {
 
        View view = mInflater.inflate(this.mLayout, parent, false);
 
        AppCompatCheckBox checkBox = (AppCompatCheckBox) view.findViewById(R.id.checkBox);
 
        RepeatListItem repeatListItem = mRepeats.get(position);
 
        checkBox.setChecked(repeatListItem.getIsChecked());
        checkBox.setText(repeatListItem.getName());
 
        return view;
    }
}
Вот так привязываю адаптер к ListView:
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
34
35
public class SelectRepeatActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_repeat);
 
        Intent intent = this.getIntent();
        int repeat = intent.getIntExtra("repeat", 0);
        ListView lv = (ListView)findViewById(R.id.repeatListView);
        List<RepeatListItem> repeats = new ArrayList<RepeatListItem>();
        final String[] weekDays = getResources().getStringArray(R.array.weekDays);
        for(int i = 0; i < weekDays.length; i++){
            repeats.add(i, new RepeatListItem(weekDays[i], WeekDays.isDayInSet(repeat, i)));
        }
        RepeatListAdapter adapter = new RepeatListAdapter(this,
            R.layout.repeat_list_item, repeats);
        lv.setAdapter(adapter);
    }
...
 
    private int packDays() {
        int result = 0;
        ListView lv = (ListView)findViewById(R.id.repeatListView);
        Adapter adpater = lv.getAdapter();
        for (int i = 0; i < lv.getCount(); i++){
            RepeatListItem item = (RepeatListItem) lv.getItemAtPosition(i);
            if (item.getIsChecked() == true)
                result |= WeekDays.getDayCode(i);
            else
                result &= ~WeekDays.getDayCode(i);
        }
        return result;
    }
}
Примеры взял с "просторов Инета". Передаваемые через intent данные отображаются в списке нормально. А вот изменения, вносимые в список, не передаются обратно. Обрабатываю изменения в методе packDays класса SelectRepeatActivity Если покликать по checkbox'ам, то состояние адаптера не меняется. И в нём остаются только те данные, которые были переданы в него в методе onCreate.

Внимание, вопрос: почему в адаптер не передаются изменения, сделанные пользователем? Что делаю не так? И как сделать так, чтобы получить изменения, внесённые пользователем. В примерах всё заканчивается выбором одного или нескольких полей ListView.

P.S. Checkbox взят только для примера. На самом деле, предполагается, что в ListView будут отображаться более сложные структуры, содержащие и checkbox'ы в том числе.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.01.2018, 06:55
Ответы с готовыми решениями:

Передача данных из ListView в другой Activity в ListView
Добрый день. Пытаюсь разобраться с передачей данных с ListView, но выходит что то непонятное, скриншоты приложения приложил. После...

ListView: передача данных в item
Элементы ListView содержат три TextView и два ImageView. В первый TextView записываю данные так: ArrayAdapter&lt;String&gt; adapter...

Передача данных между ListView
Доброго времени суток форумчане! Не получается решить одну проблему, надеюсь на вашу помощь. В классе фрагмента есть метод onCreateView,...

4
 Аватар для Faiotti
29 / 30 / 15
Регистрация: 24.01.2018
Сообщений: 132
25.01.2018, 16:32
Лучший ответ Сообщение было отмечено Abejon как решение

Решение

А где ты вызываешь setIsChecked при клике по чекбоксу?
Походу нигде) А надо в адаптере в getView вешать такой листенер, который его вызовет.
1
3 / 2 / 2
Регистрация: 21.03.2017
Сообщений: 297
25.01.2018, 18:58  [ТС]
Спасибо, дружище! Запаботало!
Т.е. получается, что я должен на каждый элемент вешать обработчик события, который будет при изменении состояния этого элемента передавать в адаптер новое значение?
0
 Аватар для Faiotti
29 / 30 / 15
Регистрация: 24.01.2018
Сообщений: 132
25.01.2018, 20:13
Abejon, Пожалуйста!
Разумеется. А кто иначе вызовет setIsChecked?
0
3 / 2 / 2
Регистрация: 21.03.2017
Сообщений: 297
26.01.2018, 08:17  [ТС]
Ну, я думал, что адаптер сам забирает значения из вьюшек.
В общем, спасибо ещё раз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.01.2018, 08:17
Помогаю со студенческими работами здесь

Передача данных из listview намерением в другой активити
Добрый вечер, подскажите как осуществить передачу значений listview намерением в другой активити. Текстовые поля передаются вопрос по...

Передача данных в listview родительской формы
Здравствуйте, у меня возникла следующая проблема. Необходимо добавить значение в listview, который состоит из двух столбцов. Всего в...

Передача потока данных из listview в textbox и обратно
Доброго дня всем.) Есть форма1 с listview. ListView считывает текстовый файл с данными.(Пример одной записи:...

Передача данных из ListView с однои формы в ListViewна другои форме
На главнои форме заполняется ListView. По кнопке открывается другая форма. Как передать содержимое ListView главнои формы в ListView...

Listview вывод данных и переход по нажатию на другой Listview SQLite
Доброго извините за название темы, долго не мог сформировать название, В общем у меня беда с пытаюсь написать программу где первый экран...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
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
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru