Урок 41. Используем LayoutInflater для создания списка

Обсуждение уроков
Аватара пользователя
kifir
Сообщения: 11
Зарегистрирован: 06 окт 2013, 19:03

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение kifir » 02 дек 2013, 22:30

Foenix писал(а):нет, лучше приспособить для отображения не таблицу, а список, создав свой адаптер и строку отображения, подобрав удобно расположение всех элементов в одном компоненте строки.
А в каких урока можно подсмотреть реализацию?

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

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение Foenix » 02 дек 2013, 23:15

42-55, но обязательно с 1-го, а перед этим проштудировать сайт девелопер андроид хотя бы картинки посмотреть по дизайну!
R.id.team

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

Аватара пользователя
kifir
Сообщения: 11
Зарегистрирован: 06 окт 2013, 19:03

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение kifir » 02 дек 2013, 23:21

Foenix писал(а):42-55, но обязательно с 1-го, а перед этим проштудировать сайт девелопер андроид хотя бы картинки посмотреть по дизайну!
ОГРОМНЕЙШЕЕ СПАСИБО! Буду заниматься!

ragvarod
Сообщения: 19
Зарегистрирован: 03 дек 2013, 20:25

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение ragvarod » 19 дек 2013, 20:27

Возник очень глупый вопрос!Есть база данных, курсор

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

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();
	  }
так вот на мой запрос выводиться на экран лишь название запрошенного столбца....Что забыл?

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

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение Foenix » 19 дек 2013, 20:30

Как ты думаешь, какая строчка из приведенного кода отвечает за отображение текста на экране?
R.id.team

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

ragvarod
Сообщения: 19
Зарегистрирован: 03 дек 2013, 20:25

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение ragvarod » 19 дек 2013, 20:34

tvName.setText(DB.COMPANY_COLUMN_ID);

ragvarod
Сообщения: 19
Зарегистрирован: 03 дек 2013, 20:25

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение ragvarod » 19 дек 2013, 20:45

Если я в чем то не прав, подскажите в чем?Как поступить для решения данной проблемы?

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

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение Foenix » 19 дек 2013, 20:48

Правильно.
а что это такое?
DB.COMPANY_COLUMN_ID

Ты прости, я не могу сказать тебе сразу ответ. Это не очень сложно.
R.id.team

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

ragvarod
Сообщения: 19
Зарегистрирован: 03 дек 2013, 20:25

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение ragvarod » 19 дек 2013, 20:55

Это обращение к столбцу _id в моей базе данных, мне кажется что я что то напортачил с курсорами... Мне вообще интересно как в TextView занести информацию из базы данных? В уроках ответа не нашел...

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

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение Foenix » 19 дек 2013, 21:41

Нет, это не обращение к столбцу. И столбцу не "в базе данных", и не в таблице, а в курсоре обращаться нужно.
Как обращаться к столбцу курсора по его имени неоднократно в уроках упоминалось.
Курсоры ты вообще не используешь :)
Курсор у тебя объявлен и проинициплизирован выше
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

ragvarod
Сообщения: 19
Зарегистрирован: 03 дек 2013, 20:25

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение ragvarod » 19 дек 2013, 22:13

Получается это обращение к строке COMPANY_COLUMN_ID класса DB... вот оно как, а что нужно тогда передавать в TextView?

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

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение Foenix » 19 дек 2013, 22:41

не к строке, а к константе строкового типа (или "свойству" класса)
Что передавать? попробуйте еще раз уроки полистать про sqlite. Там это не раз упоминалось. Ищите обращение к полям курсора! Как найти курсор - я объяснила.
Но прежде чем обращаться к курсору и его строкам, нужно определить - не null ли он, не пустой ли, а затем переместить указатель записи на его 1 строку. И только потом прочитать. Ведь курсор может содержать не 1 строку, так?
R.id.team

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

ragvarod
Сообщения: 19
Зарегистрирован: 03 дек 2013, 20:25

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение ragvarod » 19 дек 2013, 22:49

вроде бы более или менее понял! большое спасибо! Возникнут вопросы, отпишусь)

TittTitov
Сообщения: 27
Зарегистрирован: 20 ноя 2013, 22:46

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение TittTitov » 18 янв 2014, 12:16

Здравствуйте!

Если не составит труда, объясните эту строчку:

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

item.getLayoutParams().width = LayoutParams.MATCH_PARENT;
Я правильно понимаю, что здесь присваивается LayoutParams для View item со значением width = MATCH_PARENT?
Иначе мы могли бы cделать это так?:

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

LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
item.setLayoutParams(lp);
Большая просьба, также, объяснить, как работает метод valueOf().
Например, вот здесь: String.valueOf(salary));
Спасибо!

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение парень » 21 янв 2014, 16:18

Попробую первый раз дать ответ :)

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. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение damager82 » 29 янв 2014, 19:26

TittTitov писал(а):Большая просьба, также, объяснить, как работает метод valueOf().
Например, вот здесь: String.valueOf(salary));

valueOf(abc) еще круче чем "" + abc тем, что в некоторых случаях не будет создан новый String объект, а будет использован уже имеющийся с таким же строковым значением, если он существует. Где-то когда-то я читал об этом.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

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

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение dusshes » 27 фев 2014, 19:31

Привет всем!

Начал изучать 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 для создания списка

Сообщение KamiSempai » 27 фев 2014, 21:05

:shock: ListView использовать не пробовали?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение dusshes » 27 фев 2014, 21:21

От ListView я отказался по причине довольно сложного поведения элементов на экране. Все таки ListView накладывает некоторые ограничения.
А Вы советуете использовать ListView потому, что уверены в том, что он формируется быстрее? Если это так, то готов пересмотреть свое отношение к нему и попытаться реализовать в нем то, что раньше не получилось.
Но что-то мне подсказывает, что выигрыша по времени не будет...
Хотя как направление для копания принимаю.
Какие еще мысли?

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

Re: Урок 41. Используем LayoutInflater для создания списка

Сообщение Foenix » 27 фев 2014, 23:06

я честно говоря не поняла как вы заменяете листвью, но про листвью могу сказать, что там разработчиками придуман хороший механизм его ускорения и сохранения памяти (можете почитать о этом и статьи и видео есть).
А так же при значительном количестве показываемых элементов в строке списка нужно использовать в адаптере списка паттерн называемый 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

Ответить