Урок 53. SimpleCursorTreeAdapter, пример использования

Обсуждение уроков
math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение math64 » 20 авг 2012, 08:33

Вот, нашёл описание, как настраивать lint: http://developer.android.com/intl/ru/to ... -lint.html
Строки, которые не нужно переводить, можно поместить в файл donottranslate.xml - но ошибка исчезает не сразу.
Как запретить проверять переводы на конкретный язык - так и не нашёл.

lancer
Сообщения: 12
Зарегистрирован: 21 ноя 2012, 23:12

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение lancer » 25 дек 2012, 07:48

Добрый. Подскажите пожалуйста как получить элемент группы в setOnChildClickListener?
id группы, id элемента и группу получил, а элемент группы не могу понять как. Из базы данных запрос идет с сортировкой и выборкой, так-что по id не получается.

elvMain.setOnChildClickListener(new OnChildClickListener() {
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
cursor.moveToPosition(groupPosition);
pos = cursor.getString(2);
tvText1.setText(String.format("%s, %s, %s",groupPosition, childPosition, pos));
return false;
}
});

Заранее благодарен.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение KamiSempai » 25 дек 2012, 11:11

Для этого у SimpleCursorTreeAdapter есть метод getChild(int groupPosition, int childPosition).
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

lancer
Сообщения: 12
Зарегистрирован: 21 ноя 2012, 23:12

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение lancer » 31 дек 2012, 19:34

Добрый. Всех с наступающем новым годом!
Не могу понять: setOnChildClickListener не прописан вообще, а при нажатии на элемент группы выдает
12-31 16:55:33.708: E/CursorWindow(31844): Bad request for field slot 0,-1. numRows = 47, numColumns = 7

lancer
Сообщения: 12
Зарегистрирован: 21 ноя 2012, 23:12

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение lancer » 01 янв 2013, 14:35

Проблема решилась.
Я так понимаю при использовании адаптеров обязательным должно быть наличие поля _id.
У меня была связанная таблица. После того как одно поле я переименовал в "_id" все заработало.

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

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение Foenix » 02 янв 2013, 00:08

lancer писал(а):Проблема решилась.
Я так понимаю при использовании адаптеров обязательным должно быть наличие поля _id.
У меня была связанная таблица. После того как одно поле я переименовал в "_id" все заработало.
Ага, обязательно. И это, по-моему, не тайна.. на уроках вроде упоминалось.
R.id.team

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

Artemko
Сообщения: 26
Зарегистрирован: 16 июл 2012, 15:09

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение Artemko » 02 авг 2013, 15:59

del
Последний раз редактировалось Artemko 03 авг 2013, 14:34, всего редактировалось 1 раз.

Artemko
Сообщения: 26
Зарегистрирован: 16 июл 2012, 15:09

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение Artemko » 03 авг 2013, 14:27

Как при нажатии на запись получать данные из нее? Данные которые были занесены в БД

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

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение Foenix » 03 авг 2013, 19:21

в уроках есть это.
R.id.team

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

Andrey
Сообщения: 3
Зарегистрирован: 30 авг 2013, 14:06

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение Andrey » 16 сен 2013, 10:47

Подскажите, пожалуйста, где взять пример класса TreeView с 3-4 уровнями вложенности?
Пробовал http://code.google.com/p/tree-view-list-android/
Проект ориентирован на дерево check box’ов, у меня задача - поля ввода (суммы).
Убрал checkbox'и, добавил текстовые поля - в итоге, при первом кликании на поле ввода, появляется не цифровая, а алфавитная клавиатура (хотя стоит свойство android:inputType="numberDecimal"), фокус ввода в никуда, и только при повторном кликании на поле ввода появляется нормальная клавиатура и вводимые данные начинают попадать в поле.

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

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение Foenix » 16 сен 2013, 12:05

пример по твоей ссылке работает отлично
текстовые поля в ветках дерева плохой вариант с точки зрения интерфейса. Но если хочешь реализовать придется помучиться.
R.id.team

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

Andrey
Сообщения: 3
Зарегистрирован: 30 авг 2013, 14:06

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение Andrey » 17 сен 2013, 08:12

Проблема оказалась типичная.
Нашёл решение на http://stackoverflow.com/questions/8258 ... w-keyboard
Change to activity in mainfest.xml:
<activity android:name= ".yourActivity" android:windowSoftInputMode="adjustPan"/>
- после этого клавиатура и фокус стали в норме.
рекомендуют также указать
<ListView
android:id="@android:id/list"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:descendantFocusability="beforeDescendants"
/>

hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение hard » 24 сен 2013, 08:28

Подскажите?! Имеется БД с главной таблицей с полями название, id автора, id издания и тд, и имеются вспомогательные таблицы уже со списком авторов и изданий. Я с помощью CursorAdaptera вывожу название в листвьев и хочу сделать чтоб автор и издание тоже выходили. Будет ли ужасным решение, каждый раз в адаптере делать запрос к бд, получать курсоры с авторов и изданий нужных мне(по айди) и вставлять в листвьев???

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение KamiSempai » 24 сен 2013, 12:38

Если ID в связанных таблицах объявлен как "INTEGER PRIMARY KEY" то для SQLite это не критично, в отличии от серверных баз данных. Только в данном случае нужно постоянно держать БД открытой.

Однако, можно сделать нормальный запрос с использованием JOIN и не мучиться подобными вопросами.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение Foenix » 24 сен 2013, 13:13

1 Какой ты хочешь список? дерево? так в уроке все написано ж, выбирать и строить дерево нужно сразу.
или я не поняла вопрос.
2 обращение к бд идет в момент запроса. КУрсор уже к бд отношения не имеет. Закрывать бд тоже не нужно после запросов
http://stackoverflow.com/questions/4464 ... n-database
R.id.team

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

dusshes
Сообщения: 23
Зарегистрирован: 25 сен 2013, 14:23

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение dusshes » 26 сен 2013, 09:06

Почему так происходит?
Две активити. На первой ExpandableListView с MyAdapter extends SimpleCursorTreeAdapter.
Разворачиваю несколько групп, выделяю несколько чилдов. И жму кнопку "Открыть второе активити". При закрытии второго активити (даже стрелкой "назад"). Возвращаемся в первое активити и что видим? Все группы ExpandableListView свернуты. Такое ощущение, что произошло обновление контрола.
Почему это происходит и как с этим бороться?
Хочу чтобы в первом активити все оставалось без изменений, Вплоть до выделенных чилдов и позиции скролинга.

PS: кстати если второе активити сделать с диалоговой темой, то все работает ка мне надо. Логики не понимаю.

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

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение Foenix » 26 сен 2013, 15:03

Чтобы понять отличие "логику", нужно почитать про жизненный цикл активити.
на первый вопрос ответ тут http://stackoverflow.com/questions/4184 ... stactivity
к сожалению, придется вручную восстанавливать положение веток.
R.id.team

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

dusshes
Сообщения: 23
Зарегистрирован: 25 сен 2013, 14:23

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение dusshes » 26 сен 2013, 15:29

Вау!!!
Отличный пример. Спасибо!!!

dusshes
Сообщения: 23
Зарегистрирован: 25 сен 2013, 14:23

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение dusshes » 26 сен 2013, 21:11

По мотивам примера сделал такой класс:

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

	public static class elv_State {
		/// Сохраненное кол-во развернутых групп ///
		public static int expandedGroupCount;

		/// Сохраненные IDs развернутых групп ///
		public static long expandedGroupIds[];

		/// Сохраненное POSITION первого видимого элемента ///
		public static int firstPos;

		/// Сохраняем состояние ExpandableListView ///
		public static void save_state(ExpandableListView elv) {
			expandedGroupCount = countExpandedGroups(elv);
			firstPos = elv.getFirstVisiblePosition();

			expandedGroupIds = new long[expandedGroupCount];
			ExpandableListAdapter adapter = elv.getExpandableListAdapter();
			if (adapter != null) {
				for (int i = 0, ii = 0; i < adapter.getGroupCount(); i++) {
					if (elv.isGroupExpanded(i)) {
						expandedGroupIds[ii++] = adapter.getGroupId(i);
					}
				}
			}
		}

		/// Восстанавливаем состояние ExpandableListView ///
		public static void restore_state(ExpandableListView elv) {
			if (expandedGroupIds != null) {
				ExpandableListAdapter adapter = elv.getExpandableListAdapter();
				if (adapter != null) {
					for (int i = 0; i < adapter.getGroupCount(); i++) {
						if (inArray(expandedGroupIds, adapter.getGroupId(i)))
							elv.expandGroup(i);
						else
							elv.collapseGroup(i);
					}
				}
			}
			elv.setSelection(firstPos);
		}

		private static boolean inArray(long[] array, long element) {
			for (long l : array) {
				if (l == element) {
					return true;
				}
			}
			return false;
		}

		private static int countExpandedGroups(ExpandableListView elv) {
			int res = 0;
			for (int i = 0; i < elv.getExpandableListAdapter().getGroupCount(); i++) {
				if (elv.isGroupExpanded(i)) {
					res++;
				}
			}
			return res;
		}
	}
Теперь достаточно создать объект этого класса:

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

elv_State elvState;
И когда надо сохранить состояние ExpandableListView делаем

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

elvState.save_state(elv_products);
и когда надо восстановить состояние:

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

elvState.restore_state(elv_products);
Причем этот класс в отличии от примера сворачивает "лишние" группы, а так же восстанавливает позицию скроллинга.
Если кому пригодится, буду рад.

dusshes
Сообщения: 23
Зарегистрирован: 25 сен 2013, 14:23

Re: Урок 53. SimpleCursorTreeAdapter, пример использования

Сообщение dusshes » 28 сен 2013, 00:19

Что-то не могу решить задачку, второй день бьюсь.
Известно id чилда. Нужно выделить этот чилд (сделать ему checked).
Есть красивое решение?

Ответить