Урок 43. Одиночный и множественный выбор в ListView

Обсуждение уроков
a13x
Сообщения: 2
Зарегистрирован: 14 июн 2014, 23:35

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение a13x » 15 июн 2014, 00:14

Всем привет, прошу совет!

Как мне заранее проставить галочки в списке со множественным выбором?
Что-то лыжи не едут...

У меня есть класс, наследующий ListFragment.
В нем есть метод onCreateView(), в котором создается ListView в режиме CHOICE_MODE_MULTIPLE.
Еще в нем есть метод onActivityCreated(), в котором выполняется setListAdapter() для ArrayAdapter<String>.
Список работает нормально. Но отобразить его с заранее проставленными галочками не получается :(

Пробую вот так выставить галочку на нулевом пункте списка tickList:

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

tickList.performItemClick(tickList.getAdapter().getView(0, null, null), 0, tickList.getAdapter().getItemId(0));
По идее, эта штука должна дать эффект после вызова setListAdapter() в функции onActivityCreated().
Но там она не срабатывает.
Попробовал запихнуть ее в метод onStart() в этом фрагменте, но он выполнился даже раньше onCreateView(),
как показал отладчик.

Надеюсь на помощь, спасибо!

Viewer
Сообщения: 180
Зарегистрирован: 30 апр 2014, 11:42

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Viewer » 15 июн 2014, 04:12

tickList.setItemChecked(position, true);
Этим методом можно выставить все галочки в тех позициях где они вам нужны

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

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Foenix » 15 июн 2014, 07:38

Viewer писал(а):tickList.setItemChecked(position, true);
Этим методом можно выставить все галочки в тех позициях где они вам нужны
неправильно.
Листвью лишь отображает некоторые ДАННЫЕ. Поэтому менять нужно ДАННЫЕ, а не то, что на экране. При правильной настройке отображения данных в листвью - список сам покажет галочки или их отсутствие.
R.id.team

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

Viewer
Сообщения: 180
Зарегистрирован: 30 апр 2014, 11:42

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Viewer » 15 июн 2014, 08:30

Foenix писал(а):
Viewer писал(а):tickList.setItemChecked(position, true);
Этим методом можно выставить все галочки в тех позициях где они вам нужны
неправильно.
Листвью лишь отображает некоторые ДАННЫЕ. Поэтому менять нужно ДАННЫЕ, а не то, что на экране. При правильной настройке отображения данных в листвью - список сам покажет галочки или их отсутствие.
Что опять неправильно? Любите вы спорить...
Человек использует ArrayAdapter<String> и скорее всего simple_list_item_checked c CheckedTextView. Где в ArrayAdapter<String> данные о чекбоксах? Иногда в простейших случаях нет смысла городить сложные адаптеры, БД, HashMap и т.п.
Так что неправильно для данного конкретного случая?

Android достаточно гибок и этот механизм был задуман как раз для простых случаев, к тому же не отмечен как "устаревший" и ArrayAdapter прекрасно работает с CheckedTextView и глюков биндинга связанных с кэшированием (или повторным использованием разметки для элементов списка) в данном случае не будет. Вот если бы он использовал кастомную разметку, без использования Checkable интерфейса для элементов списка, тогда да, нужно было бы все делать только через данные.
К слову, ArrayAdapter, наверное, единственный из всех штатных адаптеров, сам, по совместительству, является хранилищем данных для ListView ;)

a13x
Сообщения: 2
Зарегистрирован: 14 июн 2014, 23:35

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение a13x » 17 июн 2014, 11:13

Viewer писал(а): Человек использует ArrayAdapter<String> и скорее всего simple_list_item_checked c CheckedTextView. Где в ArrayAdapter<String> данные о чекбоксах? Иногда в простейших случаях нет смысла городить сложные адаптеры, БД, HashMap и т.п.
Спасибо за эту реплику, Viewer!
Она в итоге помогла мне разобраться. Описываю, потому что кому-нибудь это может быть полезным.

Я не использую CheckedTextView, мой класс наследует от ListFragment.
В методе onCreateView() я выполняю:

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

ListView tickList = (ListView) v.findViewById(android.R.id.list);
tickList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
А в методе onActivityCreated() я наполняю список данными из массива values:

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

setListAdapter(new ArrayAdapter<String>(getActivity(),
	                android.R.layout.simple_list_item_multiple_choice,
	                android.R.id.text1, values));
Сначала я пробовал сделать в onCreateView() вот так:

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

tickList.setItemChecked(position, true);
Но это не сработало.

Потом выяснил, что галочки нужно отмечать для основного ListView, который
подразумевается в ListFragment (правильно я выразился?). То есть выполнить в onActivityCreated():

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

ListView lv = getListView();
lv.setItemChecked(1, true);

Viewer
Сообщения: 180
Зарегистрирован: 30 апр 2014, 11:42

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Viewer » 17 июн 2014, 12:41

a13x писал(а): Я не использую CheckedTextView, мой класс наследует от ListFragment.
Вы используете android.R.layout.simple_list_item_multiple_choice
А если посмотреть в его исходник (он находится в <sdk>\platforms\android-XX\data\res\layout) то мы увидим, что там в качестве корневого и единственного view используется как раз таки CheckedTextView
[syntax=xml]<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeightSmall"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
/>[/syntax]

fermopili
Сообщения: 9
Зарегистрирован: 26 дек 2012, 23:32

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение fermopili » 18 июн 2014, 17:59

в рассматриваемом примере урока, данные занесенные в Listview мы берем из массива String[] names, в котором информация(в принципе) дублируется, а как туже "Даша" вытащить из самого Listview , используя к примеру onItemClick(AdapterView<?> parent, View view, int position, long id), где id является номером позиции Listview где расположены данные , соответствующие "Даша".

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

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Foenix » 18 июн 2014, 18:18

по position
R.id.team

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

fermopili
Сообщения: 9
Зарегистрирован: 26 дек 2012, 23:32

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение fermopili » 18 июн 2014, 21:23

достаточно задать вопрос, а ответ сам прийдет через полчаса;
Я уперся Object obj=(Object)((AdapterView<ListAdapter>) view).getItemAtPosition((int) id); , а нужно было
Object obj=(Object)((AdapterView<ListAdapter>) parent).getItemAtPosition((int) id);
однако я так и не понял отличие id от position хотя в документации написано :
position The position of the view in the adapter.
id The row id of the item that was clicked.
а разве может быть разное количесто view в adapter-е и строк в Listview, хотя я еще не все знаю, я не волшебник, я только учусь

Viewer
Сообщения: 180
Зарегистрирован: 30 апр 2014, 11:42

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Viewer » 19 июн 2014, 09:14

fermopili писал(а):в рассматриваемом примере урока, данные занесенные в ListView мы берем из массива String[] names, в котором информация(в принципе) дублируется, а как туже "Даша" вытащить из самого ListView , используя к примеру onItemClick(AdapterView<?> parent, View view, int position, long id), где id является номером позиции ListView где расположены данные , соответствующие "Даша".
Сам по себе ListView постоянно не хранит в себе данных, он их получает динамически по мере надобности из источника данных посредством адаптера, это позволяет существенно сэкономить используемую оперативную память, т.е. в памяти устройства Listview хранит лишь те элементы, которые в данный момент видны на экране. При прокрутке списка ListView динамически получает из адаптера все необходимые элементы разметки каждого item-а который должен быть отображен и все данные которыми они должны быть заполнены. Поэтому из ListView никаких данных "не нужно вытаскивать", их нужно получать либо из источника данных, либо с помощью адаптера, для этого у него есть соответствующий метод getItem(int position). ArrayAdapter сам является хранилищем данных, в данном случае "Дашу" :) правильнее было бы получить используя метод адаптера getItem(int position).
однако я так и не понял отличие id от position хотя в документации написано :
С каждым элементом списка (строкой Listview) может быть ассоциирован некий id и он не обязательно должен совпадать с position, все зависит от реализации конкретного адаптера, в частности его метода getItemId(int position), если заглянуть в исходник ArrayAdapter, то мы там увидим следующее:
[syntax=java] public long getItemId(int position) {
return position;
}[/syntax]

Т.е. для данного адаптера position и id будут совпадать (отличаться лишь только типом long вместо int).

Ivan2007
Сообщения: 22
Зарегистрирован: 05 янв 2015, 19:55

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Ivan2007 » 14 фев 2015, 13:10

Здравствуйте.Подскажите пожалуйста как мне реализовать несколько пунктов.
При нажатии кнопки добавление в список трех значений(типа String, double),взятые с EditText после ввода их пользователем....
И на оборот при выборе из списка пункта эти три значения выводились в EditText(для каждого значения свой EditText).
Заранее спасибо!

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

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Foenix » 14 фев 2015, 15:43

я ничего не поняла
R.id.team

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

stas
Сообщения: 6
Зарегистрирован: 19 фев 2015, 02:18

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение stas » 19 фев 2015, 02:25

Подскажите пожалуйста почему используется onClick(View arg0), а не onClick(View v)? Это потому что метод вызывает данные из массива?

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение klblk » 19 фев 2015, 08:24

stas писал(а):Подскажите пожалуйста почему используется onClick(View arg0), а не onClick(View v)? Это потому что метод вызывает данные из массива?
Вы спросили чем отличается красный воздушный шарик от зеленого воздушного шарика. С эстетической точки зрения - цветом, м.б. хим составом. Но по возможностям они не отличаются.
По сути одно и тоже. В первом случае View назвали "arg0", а во втором "v", вы можете назвать её как вам захочется.

stas
Сообщения: 6
Зарегистрирован: 19 фев 2015, 02:18

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение stas » 19 фев 2015, 13:18

klblk писал(а):
stas писал(а):Подскажите пожалуйста почему используется onClick(View arg0), а не onClick(View v)? Это потому что метод вызывает данные из массива?
Вы спросили чем отличается красный воздушный шарик от зеленого воздушного шарика. С эстетической точки зрения - цветом, м.б. хим составом. Но по возможностям они не отличаются.
По сути одно и тоже. В первом случае View назвали "arg0", а во втором "v", вы можете назвать её как вам захочется.
ха ) спасибо. вот же тупица я. самое интересное что про View v я так и думал, а сейчас этот arg0 смутил и запутал. а я еще удивлялся чего это официальная документация молчит про это....

Ленивенко
Сообщения: 8
Зарегистрирован: 10 мар 2015, 11:57

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Ленивенко » 11 мар 2015, 10:35

Добрый день. Есть ListView в каждом Item которого EditText, как вытащить данные из EditText.
Для заполнения ListView использовал SimpleAdapter

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

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение doter.ua » 11 мар 2015, 10:58

Ленивенко писал(а):Добрый день. Есть ListView в каждом Item которого EditText, как вытащить данные из EditText.
Для заполнения ListView использовал SimpleAdapter
ЭдитТекст в адаптере - плохая затея.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Ленивенко
Сообщения: 8
Зарегистрирован: 10 мар 2015, 11:57

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение Ленивенко » 11 мар 2015, 11:09

doter.ua писал(а):
Ленивенко писал(а):Добрый день. Есть ListView в каждом Item которого EditText, как вытащить данные из EditText.
Для заполнения ListView использовал SimpleAdapter
ЭдитТекст в адаптере - плохая затея.
Cпс, я уже понял, как это можно реализовать.

danek130995
Сообщения: 42
Зарегистрирован: 25 янв 2015, 18:57

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение danek130995 » 05 июл 2015, 00:10

Скажите пожалуйста, а метод sbArray.keyAt(i); зачем нужен? Почему нельзя использовать i как индекс? if (sbArray.get(i)) Log.d(LOG_TAG, names)? Я так пробовал-работает через раз. Почему так?
этот метод что, возвращает key для текущего i? Т.е. key и i не совпадают? Получается под каждым i хранится и key и value? Помогите плиз разобраться

danek130995
Сообщения: 42
Зарегистрирован: 25 янв 2015, 18:57

Re: Урок 43. Одиночный и множественный выбор в ListView

Сообщение danek130995 » 17 июл 2015, 21:19

Сам додумал-этот SparseBooleanArray хранит key и Value, i-это номер элемента массива, в котором например при i=0 key может быть равен двум, так как хранит он инфо о тех элементах, которые были нажаты.

Ответить