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

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

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

Сообщение damager82 » 12 дек 2011, 03:00

В этом уроке:

- делаем свой вариант списка

Click here to read this article!
Последний раз редактировалось damager82 02 май 2017, 23:32, всего редактировалось 5 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

marmota
Сообщения: 3
Зарегистрирован: 17 фев 2012, 11:43
Откуда: Питер

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

Сообщение marmota » 21 фев 2012, 20:52

Я не очень поняла следующий момент в уроке.
Мы создали множество объектов View из xml item.xml.
у них есть идентификаторы tvName ,tvPosition и т.д.

И мы потом все эти объекты присоединили к 1 layout - linLayout.
Как такое возможно? Те в этом лайоуте несколько элементов с одинаковыми id?

Спасибо.

SoLVeX
Сообщения: 15
Зарегистрирован: 21 фев 2012, 19:11
Контактная информация:

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

Сообщение SoLVeX » 22 фев 2012, 01:28

id уникален, так сказать, в пределах item.xml

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

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

Сообщение damager82 » 22 фев 2012, 09:56

marmota писал(а): Как такое возможно? Те в этом лайоуте несколько элементов с одинаковыми id?
Вы можете проверить и сами создать руками такой layout в редакторе.
Киньте туда два TextView и дайте им одинаковый id. Он ругнется желтым цветом, что дублируется, но приложение запустит без проблем.
А findViewById будет находить первый из двух.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

marmota
Сообщения: 3
Зарегистрирован: 17 фев 2012, 11:43
Откуда: Питер

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

Сообщение marmota » 22 фев 2012, 12:45

Пробовала. Если в разных файлах разметки id одинаковые, то вообще даже и не ругнется...
Вобщем, странно, почему такого ограничения нет.

И значит, что я потом не смогу нужный мне из этих элементов вытащить через findViewById?

И еще я хотела уточнить - правильно ли я понимаю.
Вот мы в Activity указываем layout .

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

setContentView(R.layout.my_layout);
и он внутри себя создает кучу View, которые были описаны в my_layout.xml. Потом эти View я могу найти так

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

findViewById(R.id.my_view);
Но если я вызову метод findViewById, указав параметром какой-то id, который находится в другом файле разметки, то мне метод выдаст null?

А метод
ltInflater.inflate();
создает View на основе xml, который я могу потом приделать к текущей разметке и этот View будет находится методом findViewById.

MrArachnid
Сообщения: 1
Зарегистрирован: 10 май 2012, 16:56

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

Сообщение MrArachnid » 10 май 2012, 17:02

Большое спасибо за уроки, именно с них начал изучать программирование для Андроид. Небольшая поправочка по коду - вместо
int[] colors = new int[2];
...
colors[0] = Color.parseColor("#559966CC");
colors[1] = Color.parseColor("#55336699");

можно написать просто
int[] colors = { 0x559966CC, 0x55336699 };

Andy_NTG
Сообщения: 6
Зарегистрирован: 29 мар 2012, 12:06

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

Сообщение Andy_NTG » 21 май 2012, 09:36

Как программно очистить такой layout? Это было бы полезно, если бы потребовалось обновить данные на странице без перезагрузки Activity. То есть это что-то вроде методов Clear() в C#.

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

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

Сообщение damager82 » 21 май 2012, 12:34

Andy_NTG писал(а):Как программно очистить такой layout? Это было бы полезно, если бы потребовалось обновить данные на странице без перезагрузки Activity. То есть это что-то вроде методов Clear() в C#.
Есть такой метод - removeAllViews. В уроке 17 использую.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Andy_NTG
Сообщения: 6
Зарегистрирован: 29 мар 2012, 12:06

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

Сообщение Andy_NTG » 21 май 2012, 15:26

А, вижу. Спасибо. Я пару книжек по Андроиду уже изучил, потому курс смотрю вразнобой. Даже после прочитанных книжек, тут есть что посмотреть, не говоря уже о том, что это неплохой справочный материал.

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

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

Сообщение damager82 » 23 май 2012, 08:57

Andy_NTG писал(а):А, вижу. Спасибо. Я пару книжек по Андроиду уже изучил, потому курс смотрю вразнобой. Даже после прочитанных книжек, тут есть что посмотреть, не говоря уже о том, что это неплохой справочный материал.
Да я сам иногда в свои же уроки заглядываю подсмотреть чего-нить )
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

romanew
Сообщения: 13
Зарегистрирован: 11 июл 2012, 10:28

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

Сообщение romanew » 11 июл 2012, 10:34

Здравствуйте, подскажите есть вопрос про ScrollView
у меня как и написано в уроке в ScrollView лежит LinearLayout в который я загружаю элементы, заданные xml файликами. Работает все хорошо. Но мне нужно организовать прокрутку в конец, т.е. когда добавляешь элемент если он уже не помещается на экран, то прокручивать в конец.
Существует функция scrollTo(x,y), если её повешать на кнопку и нажимать кнопку то он все прокручивает, а если в засунуть в код после добавления элемента в список то не прокручивает..
или еще как-нибудь может быть можно это реализовать?

romanew
Сообщения: 13
Зарегистрирован: 11 июл 2012, 10:28

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

Сообщение romanew » 23 июл 2012, 06:59

все разобрался, сделал так
public void scrollDown()
{ scroll.post(new Runnable() {
public void run() {
scroll.scrollBy(0, +1500);
//scroll.fullScroll(ScrollView.FOCUS_DOWN);
}
});
}

xottabut
Сообщения: 5
Зарегистрирован: 12 ноя 2012, 22:48

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

Сообщение xottabut » 12 ноя 2012, 22:55

Привет, почему у меня отображается на экране только первый элемент, хотя в логах показывает что прошло весь массив.

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

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

Сообщение damager82 » 14 ноя 2012, 12:06

xottabut писал(а):Привет, почему у меня отображается на экране только первый элемент, хотя в логах показывает что прошло весь массив.
Скиньте сюда код, если он отличен от урока
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

xottabut
Сообщения: 5
Зарегистрирован: 12 ноя 2012, 22:48

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

Сообщение xottabut » 18 ноя 2012, 17:53

damager82 писал(а):
xottabut писал(а):Привет, почему у меня отображается на экране только первый элемент, хотя в логах показывает что прошло весь массив.
Скиньте сюда код, если он отличен от урока
код ничем не отличается

xottabut
Сообщения: 5
Зарегистрирован: 12 ноя 2012, 22:48

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

Сообщение xottabut » 18 ноя 2012, 18:03

damager82 писал(а):
xottabut писал(а):Привет, почему у меня отображается на экране только первый элемент, хотя в логах показывает что прошло весь массив.
Скиньте сюда код, если он отличен от урока
Спасибо, уже нашел ошибку)
<LinearLayout
android:id="@+id/linLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
а надо
<LinearLayout
android:id="@+id/linLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</LinearLayout>
получается в первом варианте список был горизонтальный и я его не видел.

romanzi
Сообщения: 8
Зарегистрирован: 31 май 2012, 21:55

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

Сообщение romanzi » 14 дек 2012, 17:35

Как узнать по какому элементу списка кликнули?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 14 дек 2012, 20:00

romanzi писал(а):Как узнать по какому элементу списка кликнули?

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

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
   public void onItemClick(AdapterView parentView, View childView, int position, long id) {  
            //position - позиция в списке
            //id - айди привязанных данных к адаптеру
        } 
      }); 
R.id.team
Политика на форуме запрещена

heluvet
Сообщения: 8
Зарегистрирован: 20 дек 2012, 09:48

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

Сообщение heluvet » 20 дек 2012, 11:09

Клевые у Вас уроки!

Возник такой вопрос. В цикле переменные tv... каждый раз инициализируются.

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

for (int i = 0; i < name.length; i++) {
      Log.d("myLogs", "i = " + i);
      View item = ltInflater.inflate(R.layout.item, linLayout, false);
      TextView tvName = (TextView) item.findViewById(R.id.tvName);
      tvName.setText(name[i]);
      TextView tvPosition = (TextView) item.findViewById(R.id.tvPosition);
      tvPosition.setText("Должность: " + position[i]);
      TextView tvSalary = (TextView) item.findViewById(R.id.tvSalary);
      tvSalary.setText("Оклад: " + String.valueOf(salary[i]));
      item.getLayoutParams().width = LayoutParams.MATCH_PARENT;
      item.setBackgroundColor(colors[i % 2]);
      linLayout.addView(item);
    }
Почему невозможен такой вариант?

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

 
      TextView tvName = (TextView) item.findViewById(R.id.tvName);
      TextView tvPosition = (TextView) item.findViewById(R.id.tvPosition);
      TextView tvSalary = (TextView) item.findViewById(R.id.tvSalary);
     for (int i = 0; i < name.length; i++) {
         Log.d("myLogs", "i = " + i);
         View item = ltInflater.inflate(R.layout.item, linLayout, false);
         tvName.setText(name[i]);
         tvPosition.setText("Должность: " + position[i]);
         tvSalary.setText("Оклад: " + String.valueOf(salary[i]));
         item.getLayoutParams().width = LayoutParams.MATCH_PARENT;
         item.setBackgroundColor(colors[i % 2]);
         linLayout.addView(item);
    }

eternal_ego
Сообщения: 10
Зарегистрирован: 14 дек 2012, 05:19

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

Сообщение eternal_ego » 20 дек 2012, 12:41

Так ведь item-то у вас каждый раз разный, соответственно переменные каждый раз инициализируются именно потому, что соответствуют новым объектам.

Ответить