Страница 4 из 5

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

Добавлено: 15 июн 2014, 00:14
a13x
Всем привет, прошу совет!

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

У меня есть класс, наследующий 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(),
как показал отладчик.

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

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

Добавлено: 15 июн 2014, 04:12
Viewer
tickList.setItemChecked(position, true);
Этим методом можно выставить все галочки в тех позициях где они вам нужны

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

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

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

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

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

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

Добавлено: 17 июн 2014, 11:13
a13x
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);

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

Добавлено: 17 июн 2014, 12:41
Viewer
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]

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

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

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

Добавлено: 18 июн 2014, 18:18
Foenix
по position

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

Добавлено: 18 июн 2014, 21:23
fermopili
достаточно задать вопрос, а ответ сам прийдет через полчаса;
Я уперся 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, хотя я еще не все знаю, я не волшебник, я только учусь

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

Добавлено: 19 июн 2014, 09:14
Viewer
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).

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

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

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

Добавлено: 14 фев 2015, 15:43
Foenix
я ничего не поняла

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

Добавлено: 19 фев 2015, 02:25
stas
Подскажите пожалуйста почему используется onClick(View arg0), а не onClick(View v)? Это потому что метод вызывает данные из массива?

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

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

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

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

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

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

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

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

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

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

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

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

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

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