А в каких урока можно подсмотреть реализацию?Foenix писал(а):нет, лучше приспособить для отображения не таблицу, а список, создав свой адаптер и строку отображения, подобрав удобно расположение всех элементов в одном компоненте строки.
Урок 41. Используем LayoutInflater для создания списка
Re: Урок 41. Используем LayoutInflater для создания списка
Re: Урок 41. Используем LayoutInflater для создания списка
42-55, но обязательно с 1-го, а перед этим проштудировать сайт девелопер андроид хотя бы картинки посмотреть по дизайну!
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 41. Используем LayoutInflater для создания списка
ОГРОМНЕЙШЕЕ СПАСИБО! Буду заниматься!Foenix писал(а):42-55, но обязательно с 1-го, а перед этим проштудировать сайт девелопер андроид хотя бы картинки посмотреть по дизайну!
Re: Урок 41. Используем LayoutInflater для создания списка
Возник очень глупый вопрос!Есть база данных, курсор
так вот на мой запрос выводиться на экран лишь название запрошенного столбца....Что забыл?
Код: Выделить всё
public Cursor getCompanyData() {
return mDB.query(zan_TABLE, null, null, null, null, null, null);
}
Код: Выделить всё
public class MainActivity extends Activity {
ExpandableListView elvMain;
DB db;
int[] colors = new int[2];
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// подключаемся к БД
db = new DB(this);
db.open();
Cursor cursor = db.getCompanyData();
colors[0] = Color.parseColor("#559966CC");
colors[1] = Color.parseColor("#55336699");
LinearLayout linLayout = (LinearLayout) findViewById(R.id.linLayout);
LayoutInflater ltInflater = getLayoutInflater();
View item = ltInflater.inflate(R.layout.item, linLayout, false);
TextView tvName = (TextView) item.findViewById(R.id.tvName);
tvName.setText(DB.COMPANY_COLUMN_ID);
item.getLayoutParams().width = LayoutParams.MATCH_PARENT;
item.setBackgroundColor(colors[1 % 2]);
linLayout.addView(item);
}
}
protected void onDestroy() {
super.onDestroy();
db.close();
}
Re: Урок 41. Используем LayoutInflater для создания списка
Как ты думаешь, какая строчка из приведенного кода отвечает за отображение текста на экране?
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 41. Используем LayoutInflater для создания списка
tvName.setText(DB.COMPANY_COLUMN_ID);
Re: Урок 41. Используем LayoutInflater для создания списка
Если я в чем то не прав, подскажите в чем?Как поступить для решения данной проблемы?
Re: Урок 41. Используем LayoutInflater для создания списка
Правильно.
а что это такое?
DB.COMPANY_COLUMN_ID
Ты прости, я не могу сказать тебе сразу ответ. Это не очень сложно.
а что это такое?
DB.COMPANY_COLUMN_ID
Ты прости, я не могу сказать тебе сразу ответ. Это не очень сложно.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 41. Используем LayoutInflater для создания списка
Это обращение к столбцу _id в моей базе данных, мне кажется что я что то напортачил с курсорами... Мне вообще интересно как в TextView занести информацию из базы данных? В уроках ответа не нашел...
Re: Урок 41. Используем LayoutInflater для создания списка
Нет, это не обращение к столбцу. И столбцу не "в базе данных", и не в таблице, а в курсоре обращаться нужно.
Как обращаться к столбцу курсора по его имени неоднократно в уроках упоминалось.
Курсоры ты вообще не используешь
Курсор у тебя объявлен и проинициплизирован выше
Cursor cursor = db.getCompanyData();
как видишь, вначале идет слово Cursor - это тип. Далее cursor - это переменная (мы сами задаем ей любое имя), а далее, сразу (а можно и не сразу) присваиваем ей значение db.getCompanyData(). Это в свою очередь является вызовом МЕТОДА getCompanyData класса db.
А теперь скажи, что такое есть DB.COMPANY_COLUMN_ID?
Как обращаться к столбцу курсора по его имени неоднократно в уроках упоминалось.
Курсоры ты вообще не используешь
Курсор у тебя объявлен и проинициплизирован выше
Cursor cursor = db.getCompanyData();
как видишь, вначале идет слово Cursor - это тип. Далее cursor - это переменная (мы сами задаем ей любое имя), а далее, сразу (а можно и не сразу) присваиваем ей значение db.getCompanyData(). Это в свою очередь является вызовом МЕТОДА getCompanyData класса db.
А теперь скажи, что такое есть DB.COMPANY_COLUMN_ID?
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 41. Используем LayoutInflater для создания списка
Получается это обращение к строке COMPANY_COLUMN_ID класса DB... вот оно как, а что нужно тогда передавать в TextView?
Re: Урок 41. Используем LayoutInflater для создания списка
не к строке, а к константе строкового типа (или "свойству" класса)
Что передавать? попробуйте еще раз уроки полистать про sqlite. Там это не раз упоминалось. Ищите обращение к полям курсора! Как найти курсор - я объяснила.
Но прежде чем обращаться к курсору и его строкам, нужно определить - не null ли он, не пустой ли, а затем переместить указатель записи на его 1 строку. И только потом прочитать. Ведь курсор может содержать не 1 строку, так?
Что передавать? попробуйте еще раз уроки полистать про sqlite. Там это не раз упоминалось. Ищите обращение к полям курсора! Как найти курсор - я объяснила.
Но прежде чем обращаться к курсору и его строкам, нужно определить - не null ли он, не пустой ли, а затем переместить указатель записи на его 1 строку. И только потом прочитать. Ведь курсор может содержать не 1 строку, так?
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 41. Используем LayoutInflater для создания списка
вроде бы более или менее понял! большое спасибо! Возникнут вопросы, отпишусь)
Re: Урок 41. Используем LayoutInflater для создания списка
Здравствуйте!
Если не составит труда, объясните эту строчку:
Я правильно понимаю, что здесь присваивается LayoutParams для View item со значением width = MATCH_PARENT?
Иначе мы могли бы cделать это так?:
Большая просьба, также, объяснить, как работает метод valueOf().
Например, вот здесь: String.valueOf(salary));
Спасибо!
Если не составит труда, объясните эту строчку:
Код: Выделить всё
item.getLayoutParams().width = LayoutParams.MATCH_PARENT;
Иначе мы могли бы cделать это так?:
Код: Выделить всё
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
item.setLayoutParams(lp);
Например, вот здесь: String.valueOf(salary));
Спасибо!
Re: Урок 41. Используем LayoutInflater для создания списка
Попробую первый раз дать ответ
1. Правильно.
2. Второй кусок кода, задает и width и height, width=WRAP_CONTENT, height=MATCH_PARENT
Получается в первом куске кода, width=MATCH_PARENT, height - ничего. Во втором width=WRAP_CONTENT, height=MATCH_PARENT
Метод String.valueOf(salary)); Преобразовывает в строку значение salary - оно скорее всего цифровое. (урок не смотрел)
Пример
Если
String mStr="Сумма : ";
int mInt=123;
И нам надо вывести на экран "Сумма : 123", то можно сделать так: tvText.setText(mStr+mInt);
А вот если нам надо вывести только "123" то tvText.setText(mInt) - будет ругаться типо mInt не строка. и тут Вариант tvText.setText(String.valuOf(mInt)); но гораздо проще tvText.setText(""+mInt);
иными словами преобразовать число в строку можно просто сначала добавить "" а потом прибавить число (""+123=строка)
1. Правильно.
2. Второй кусок кода, задает и width и height, width=WRAP_CONTENT, height=MATCH_PARENT
Получается в первом куске кода, width=MATCH_PARENT, height - ничего. Во втором width=WRAP_CONTENT, height=MATCH_PARENT
Метод String.valueOf(salary)); Преобразовывает в строку значение salary - оно скорее всего цифровое. (урок не смотрел)
Пример
Если
String mStr="Сумма : ";
int mInt=123;
И нам надо вывести на экран "Сумма : 123", то можно сделать так: tvText.setText(mStr+mInt);
А вот если нам надо вывести только "123" то tvText.setText(mInt) - будет ругаться типо mInt не строка. и тут Вариант tvText.setText(String.valuOf(mInt)); но гораздо проще tvText.setText(""+mInt);
иными словами преобразовать число в строку можно просто сначала добавить "" а потом прибавить число (""+123=строка)
Мой первенец: MyMoney. Менеджер расходов
Бьем рекорды русских топов
Могу ответить на любые вопросы по маркетингу и развитию.
Бьем рекорды русских топов
Могу ответить на любые вопросы по маркетингу и развитию.
Re: Урок 41. Используем LayoutInflater для создания списка
TittTitov писал(а):Большая просьба, также, объяснить, как работает метод valueOf().
Например, вот здесь: String.valueOf(salary));
valueOf(abc) еще круче чем "" + abc тем, что в некоторых случаях не будет создан новый String объект, а будет использован уже имеющийся с таким же строковым значением, если он существует. Где-то когда-то я читал об этом.
Re: Урок 41. Используем LayoutInflater для создания списка
Привет всем!
Начал изучать java for android пол года назад именно по этим урокам. Прочитал их в начале от корки до корки и потом раз 50 выборочно. Отличные уроки. Теперь уже отношу свои знания к полупрофессиональным. Написал достаточно серьезное приложение. Пользователей все устраивает.
Но меня не устраивает... И вот что.
Организовал списки как в этом уроке. Иксэмэльки для итемов содержат по 10 лайаутов и по 15 простых элементов. Вроде не такое и огромное количество...
При выводе списков возникает некоторая задержка. Заметил, что она увеличивается от количества элементов списках. Обвесил метод формирования итема счетчиками времени выполнения каждой команды в нем. И результат меня огорошил.
Получилось, что команда
RelativeLayout v = (RelativeLayout) inflater.inflate(R.layout.cls_product_in_zakaz, null);
выполняется 30-40 миллисекунд.
При этом все остальные команды метода в сумме не дотягивают до 1 миллисекунды. А это и поиск всех элементов в итеме, и заполнение их текстом, и раскраска, и изменение размера шрифта.
Перекос на мой взгляд очень большой.
30 мсек - сам по себе временной промежуток приемлем и пользователю не заметен. Но вот когда этих итемов несколько, то проблема становится острой. 20 итемов - это уже больше пол секунды - уже дискомфорт, а если 200 итемов...? а если еще больше?
Так вот я и задумался как решить эту проблему.
Сначала я задумался как бы командой inflate воспользоваться единожды и получить объект класса RelativeLayout, а потом как-то делать его копию для каждого итема. Но не умеет java клонировать экземпляры класса RelativeLayout. Отпал вариант.
Теперь вот думаю попробовать обойтись без иксэмельки и команды inflate. Генерить слои и элементы в коде. Да теряется некоторая наглядность и усложняется дальнейшая поддержка кода в будущем. Но вдруг это ускорит метод.
Какие есть мысли? Ускорит такой подход?
Какие еще есть мысли по другим вариантам ускорения?
Предлагайте хотя бы направления для копания - я докопаюсь.
Начал изучать java for android пол года назад именно по этим урокам. Прочитал их в начале от корки до корки и потом раз 50 выборочно. Отличные уроки. Теперь уже отношу свои знания к полупрофессиональным. Написал достаточно серьезное приложение. Пользователей все устраивает.
Но меня не устраивает... И вот что.
Организовал списки как в этом уроке. Иксэмэльки для итемов содержат по 10 лайаутов и по 15 простых элементов. Вроде не такое и огромное количество...
При выводе списков возникает некоторая задержка. Заметил, что она увеличивается от количества элементов списках. Обвесил метод формирования итема счетчиками времени выполнения каждой команды в нем. И результат меня огорошил.
Получилось, что команда
RelativeLayout v = (RelativeLayout) inflater.inflate(R.layout.cls_product_in_zakaz, null);
выполняется 30-40 миллисекунд.
При этом все остальные команды метода в сумме не дотягивают до 1 миллисекунды. А это и поиск всех элементов в итеме, и заполнение их текстом, и раскраска, и изменение размера шрифта.
Перекос на мой взгляд очень большой.
30 мсек - сам по себе временной промежуток приемлем и пользователю не заметен. Но вот когда этих итемов несколько, то проблема становится острой. 20 итемов - это уже больше пол секунды - уже дискомфорт, а если 200 итемов...? а если еще больше?
Так вот я и задумался как решить эту проблему.
Сначала я задумался как бы командой inflate воспользоваться единожды и получить объект класса RelativeLayout, а потом как-то делать его копию для каждого итема. Но не умеет java клонировать экземпляры класса RelativeLayout. Отпал вариант.
Теперь вот думаю попробовать обойтись без иксэмельки и команды inflate. Генерить слои и элементы в коде. Да теряется некоторая наглядность и усложняется дальнейшая поддержка кода в будущем. Но вдруг это ускорит метод.
Какие есть мысли? Ускорит такой подход?
Какие еще есть мысли по другим вариантам ускорения?
Предлагайте хотя бы направления для копания - я докопаюсь.
Последний раз редактировалось dusshes 28 фев 2014, 21:59, всего редактировалось 1 раз.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 41. Используем LayoutInflater для создания списка
ListView использовать не пробовали?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 41. Используем LayoutInflater для создания списка
От ListView я отказался по причине довольно сложного поведения элементов на экране. Все таки ListView накладывает некоторые ограничения.
А Вы советуете использовать ListView потому, что уверены в том, что он формируется быстрее? Если это так, то готов пересмотреть свое отношение к нему и попытаться реализовать в нем то, что раньше не получилось.
Но что-то мне подсказывает, что выигрыша по времени не будет...
Хотя как направление для копания принимаю.
Какие еще мысли?
А Вы советуете использовать ListView потому, что уверены в том, что он формируется быстрее? Если это так, то готов пересмотреть свое отношение к нему и попытаться реализовать в нем то, что раньше не получилось.
Но что-то мне подсказывает, что выигрыша по времени не будет...
Хотя как направление для копания принимаю.
Какие еще мысли?
Re: Урок 41. Используем LayoutInflater для создания списка
я честно говоря не поняла как вы заменяете листвью, но про листвью могу сказать, что там разработчиками придуман хороший механизм его ускорения и сохранения памяти (можете почитать о этом и статьи и видео есть).
А так же при значительном количестве показываемых элементов в строке списка нужно использовать в адаптере списка паттерн называемый ViewHolder
можно посмотреть тут или в гугле
http://habrahabr.ru/post/133575/
изобретатели..
А так же при значительном количестве показываемых элементов в строке списка нужно использовать в адаптере списка паттерн называемый ViewHolder
можно посмотреть тут или в гугле
http://habrahabr.ru/post/133575/
изобретатели..
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198