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

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

25.01.2018, 06:55. Показов 1480. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru