Урок 53. SimpleCursorTreeAdapter, пример использования
Урок 53. SimpleCursorTreeAdapter, пример использования
В этом уроке:
- используем SimpleCursorTreeAdapter для построения списка
[url=http://www.startandroid.ru/ru/uroki/vse ... l:av6drp4a]Click here to read this article![/url:av6drp4a]
- используем SimpleCursorTreeAdapter для построения списка
[url=http://www.startandroid.ru/ru/uroki/vse ... l:av6drp4a]Click here to read this article![/url:av6drp4a]
Последний раз редактировалось damager82 08 май 2017, 16:00, всего редактировалось 5 раз.
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
чтото туплю я.
делаю контекстное меню для ExpandedListView
как узнать, меню было вызвано при клике на группу или на чайлд?
-------------------------
отвечаю сам.
ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo)item.getMenuInfo();
long packedPosition = ExpandableListView.getPackedPositionType(info.packedPosition);
if (packedPosition == ExpandableListView.PACKED_POSITION_TYPE_GROUP) //кликнули на группе
...
else if (packedPosition == ExpandableListView.PACKED_POSITION_TYPE_CHILD) //кликнули на чайлде
вобщем то все тривиально оказалось
делаю контекстное меню для ExpandedListView
как узнать, меню было вызвано при клике на группу или на чайлд?
-------------------------
отвечаю сам.
ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo)item.getMenuInfo();
long packedPosition = ExpandableListView.getPackedPositionType(info.packedPosition);
if (packedPosition == ExpandableListView.PACKED_POSITION_TYPE_GROUP) //кликнули на группе
...
else if (packedPosition == ExpandableListView.PACKED_POSITION_TYPE_CHILD) //кликнули на чайлде
вобщем то все тривиально оказалось
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Объясните, пожалуйста, почему в методе getPhoneData мы прописываем groupCursor.getInt(idColumn), а не idColumn ? Не очень понимаю, для чего нужен метод getInt..
protected Cursor getChildrenCursor(Cursor groupCursor) {
// получаем курсор по элементам для конкретной группы
int idColumn = groupCursor.getColumnIndex(DB.COMPANY_COLUMN_ID);
return db.getPhoneData(groupCursor.getInt(idColumn));
}
protected Cursor getChildrenCursor(Cursor groupCursor) {
// получаем курсор по элементам для конкретной группы
int idColumn = groupCursor.getColumnIndex(DB.COMPANY_COLUMN_ID);
return db.getPhoneData(groupCursor.getInt(idColumn));
}
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Это особенности работы курсора. Он может выдать нам данные только, если мы укажем ему номер столбца. А этот номер мы можем получить по имени столбца. idColumn - это номер столбца курсора.Jane писал(а):Объясните, пожалуйста, почему в методе getPhoneData мы прописываем groupCursor.getInt(idColumn), а не idColumn ? Не очень понимаю, для чего нужен метод getInt..
protected Cursor getChildrenCursor(Cursor groupCursor) {
// получаем курсор по элементам для конкретной группы
int idColumn = groupCursor.getColumnIndex(DB.COMPANY_COLUMN_ID);
return db.getPhoneData(groupCursor.getInt(idColumn));
}
Здесь мы получаем на вход groupCursor, который содержит данные о группах. Наша задача - вернуть курсор с данными по элементам группы. Чтобы эти данные по элементам получить, нам нужно знать ID группы. Мы знаем имя столбца (DB.COMPANY_COLUMN_ID), в котором лежит ID. По этому имени получаем номер столбца с помощью метода getColumnIndex. И теперь этот номер столбца (idColumn) используем чтобы достать ID. Ну и далее полученный ID передаем в getPhoneData.
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Теперь всё ясно! Спасибо большое!
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Комрады, добрый день!
Оч хочется узнать как вы находите неявные ошибки в коде?
Я например анализирую LogCat и по смыслу (например NullPointer) понимаю, что где то объекта почему то не создано и начинаю дебажить с целью выявить где валится... Но вот почему нельзя посмотреть в какой строке или хотя бы в каком методе и какого класса это происходит!! Наверняка я чего то не знаю.. подскажите какие есть фичи на эту тему? Спасибо!
--------------------------------
Внимательно посмотрел - в логах метод и класс таки увидел, отлично! Но вот как бы теперь узнать конкретную строчку или кусок кода, который вызвал дамп?
---------------------------------
Офигеть! В разделе Caused by в логах и строка указана!!! Общение с самим собой оказалось очень плодотворным, всем спасибо )))))
Оч хочется узнать как вы находите неявные ошибки в коде?
Я например анализирую LogCat и по смыслу (например NullPointer) понимаю, что где то объекта почему то не создано и начинаю дебажить с целью выявить где валится... Но вот почему нельзя посмотреть в какой строке или хотя бы в каком методе и какого класса это происходит!! Наверняка я чего то не знаю.. подскажите какие есть фичи на эту тему? Спасибо!
--------------------------------
Внимательно посмотрел - в логах метод и класс таки увидел, отлично! Но вот как бы теперь узнать конкретную строчку или кусок кода, который вызвал дамп?
---------------------------------
Офигеть! В разделе Caused by в логах и строка указана!!! Общение с самим собой оказалось очень плодотворным, всем спасибо )))))
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
чем e.printStackTrace() не устраивает? а если конкретно строчку и т.д. искать то гоу то дебаг и построчный пробег по кривому методу.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
LogCat показывает строку в которой возникло исключение и двойной клик по строке с исключением перекинет на строку в исходнике, если только сам исходник есть в проекте. Если исходника нет, то естественно строку не покажет, а только имя метода в котором произошло исключение.
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Да, точняк, перекидывает в код!! В общем все довольно удобно, видимо обилие красного текста меня смутило и на мои попытки дабл кликов не там где надо реакции не было.
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Для четвёртого Анодроида (Ice Cream) есть исходники - если подключить их к проекту, будет переходить и туда.
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Отлично! Появился ещё один вопрос правда не по теме урока...
Что такое Lint markers? Например я исправляю ошибку, но код все равно подсвечивается красным..
Давлю на иконку ошибки, выбираю из выпадающего списка Clear Lint Markers и радуюсь жизни..
Спасибо!
Что такое Lint markers? Например я исправляю ошибку, но код все равно подсвечивается красным..
Давлю на иконку ошибки, выбираю из выпадающего списка Clear Lint Markers и радуюсь жизни..
Спасибо!
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Ну есть у меня файлы values/strings.xml и values-ru/strings.xml. Запускаю Lint и он находит, что для некоторых слов нет русских переводов, а некоторые вообще не используется. И предлагает исправить: добавить перевод, удалить неиспользуемые. Это не есть ошибки - программа будет работать и без переводов - например, я не хочу переводить название приложения, а "неиспользуемые" я всё же использую (получая идентификатор через getResources().getIdentifier(name, "string", getPackageName()); - но чаще всего нужно всё же добавить перевод или удалить ненужный ресурс.
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
А, вот в чем дело! А как его запустить? Он у меня похоже автоматически отрабатывает..
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Чаще всего он отрабаватывает автоматически - но иногда его надо специально запускать. на тулбаре есть соответствующая иконка.
Иногда он ошибочно отмечает исправленную ошибку. Если файл не сохранён, нужно его сохранить (Ctrl-S), можно удалить строку и вставить обратно. Но про Clear Lint Markers не знал.
Иногда он ошибочно отмечает исправленную ошибку. Если файл не сохранён, нужно его сохранить (Ctrl-S), можно удалить строку и вставить обратно. Но про Clear Lint Markers не знал.
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Да, надо бы отдельно почитать про локализацию, спасибо!
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Да там вообще непонятно какие ошибки он автоматом отрабатывает, по идее должен все показывать при сохранении файла , но этого не происходит. Я думал, что он автоматом вылавливает только критические ошибки, а предупреждения только по явному вызову, оказалось нет. К примеру, если определить свойство onClick в xml, но не определить соответствующий метод в Activity ошибки автоматом не показывает, но при явном вызове Android-Lint она появляется. Не сказал бы, что это не критическая ошибка из-за неё приложение падает.
В настройках она отмечена как критическая (fatal):
Ensures that onClick attribute values refer to real methods
The onClick attribute value should be the name of a method in this View's context to invoke when the view is clicked. This name must correspond to a public method that takes exactly one parameter of type View.
Видимо для ускорения работы при сохранении файла запускается какая-то облегченная версия чекера, а полную нужно запускать явно либо она запустится при экспорте (если отмечен соответствующий чек. бокс в настройках). Непонятно только логика отбора ошибок для облегченной/полной версии чекера.
Так что Android Lint лучше запускать принудительно, на тулбаре есть иконка с галочкой (либо из контекстного меню Android Tools) , то что он проверяет можно посмотреть в настройках Preferences-Android-Lint Error Checking
В настройках она отмечена как критическая (fatal):
Ensures that onClick attribute values refer to real methods
The onClick attribute value should be the name of a method in this View's context to invoke when the view is clicked. This name must correspond to a public method that takes exactly one parameter of type View.
Видимо для ускорения работы при сохранении файла запускается какая-то облегченная версия чекера, а полную нужно запускать явно либо она запустится при экспорте (если отмечен соответствующий чек. бокс в настройках). Непонятно только логика отбора ошибок для облегченной/полной версии чекера.
Так что Android Lint лучше запускать принудительно, на тулбаре есть иконка с галочкой (либо из контекстного меню Android Tools) , то что он проверяет можно посмотреть в настройках Preferences-Android-Lint Error Checking
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Ценное замечание!
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Я уже писал про трудности определения неиспользуемых ресурсов. Та же трудность с методом onClick(). Да, он должен указывать на существующий метод, но в какой Activity ? За испключением очень простых проектов, как правило в проекте несколько Activity и Lint должен определить, к какому из них подключается виджет.
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
Метод onClick должен быть реализован в Activity c контекстом которой связан данный виджет. А вот как Android Lint определяет к какому контексту привязан view не знаю, или он тупо перебирает все Activity в проекте, нужно поэкспериментировать.math64 писал(а):Я уже писал про трудности определения неиспользуемых ресурсов. Та же трудность с методом onClick(). Да, он должен указывать на существующий метод, но в какой Activity ? За испключением очень простых проектов, как правило в проекте несколько Activity и Lint должен определить, к какому из них подключается виджет.
ЗЫ Не определяет, достаточно чтобы в любом месте проекта был метод с именем как в onClick и параметром View, даже не важно в каком классе (не обязательно наследника Activity) и Lint не срабатывает . Интелекта в Android Lint пока маловато. Но все равно полезная штука.
Re: Урок 53. SimpleCursorTreeAdapter, пример использования
У меня вообще нет в проекте values-ru , а Lint выдает, что я должен перевести ресурсы на ru Ну как он определил, что я вообще русский? Может я китаецmath64 писал(а):Ну есть у меня файлы values/strings.xml и values-ru/strings.xml. Запускаю Lint и он находит, что для некоторых слов нет русских переводов, а некоторые вообще не используется. И предлагает исправить: добавить перевод, удалить неиспользуемые. Это не есть ошибки - программа будет работать и без переводов - например, я не хочу переводить название приложения, а "неиспользуемые" я всё же использую (получая идентификатор через getResources().getIdentifier(name, "string", getPackageName()); - но чаще всего нужно всё же добавить перевод или удалить ненужный ресурс.
Неужто он проверяет локаль на компе?