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

Обсуждение уроков
petdroid
Сообщения: 2
Зарегистрирован: 08 окт 2014, 12:44

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

Сообщение petdroid » 09 окт 2014, 12:35

А есть ли способ отобразить миллион записей на экране Андроида?
Ну разумеется вопрос не корректный. Т.е. вынуть из БД миллион записей и отобразить их, например. Т.е. визуально будет от силы 10-20 элементов на экране, а остальные должны быть доступны по прокрутке списка например? Справится ли Андроид с такой задачей?

rjlexx
Сообщения: 7
Зарегистрирован: 20 мар 2013, 22:30

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

Сообщение rjlexx » 12 окт 2014, 23:13

Artemprodigy писал(а):список во время прокрутки плывёт, не правильно отрисовывается, как будто на друг друга налаживается
Тоже столкнулся с такой проблемой.
Scroll-Bug.png
Scroll-Bug.png (128.56 КБ) 10983 просмотра
Это можно как-то исправить или лучше сразу на ListView переделать?

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 13 окт 2014, 07:54

нужно удалить этот урок... =)
используйте ListView

rjlexx
Сообщения: 7
Зарегистрирован: 20 мар 2013, 22:30

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

Сообщение rjlexx » 13 окт 2014, 15:43

klblk писал(а):используйте ListView
Ок, так и сделал)

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

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

Сообщение Foenix » 13 окт 2014, 21:55

petdroid писал(а):А есть ли способ отобразить миллион записей на экране Андроида?
Ну разумеется вопрос не корректный. Т.е. вынуть из БД миллион записей и отобразить их, например. Т.е. визуально будет от силы 10-20 элементов на экране, а остальные должны быть доступны по прокрутке списка например? Справится ли Андроид с такой задачей?
андроид не предназначен для таких целей. Но вы всегда можете попробовать.
R.id.team

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

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

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

Сообщение Fry » 23 янв 2015, 13:27

А можно ли получить доступ к View, из которых при помощи Inflate создан "родительский" view?

Например,
[syntax=java]
View customView = layoutInflater.inflate(R.layout.custom_view,null, false);
TextView textView = (TextView)customView.findViewById(R.id.textView);[/syntax]

Как, используя customView поменять текст в textView?
Arbeit macht Fry

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 23 янв 2015, 14:00

Проще чем вы уже написали сделать не получится.

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

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

Сообщение Fry » 23 янв 2015, 14:33

Ладно, перефразирую :)

[syntax=java]public void someMethod() {
View v = getCustomView();
}

public View getCustomView(){
View customView = layoutInflater.inflate(R.layout.custom_view,null, false);
TextView textView = (TextView)customView.findViewById(R.id.textView);
return customView;
}[/syntax]

Как, имея v, получить доступ к textView и поменять в нем текст, например ?
Arbeit macht Fry

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

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

Сообщение doter.ua » 23 янв 2015, 14:45

Fry писал(а):Ладно, перефразирую :)

[syntax=java]public void someMethod() {
View v = getCustomView();
}

public View getCustomView(){
View customView = layoutInflater.inflate(R.layout.custom_view,null, false);
TextView textView = (TextView)customView.findViewById(R.id.textView);
return customView;
}[/syntax]

Как, имея v, получить доступ к textView и поменять в нем текст, например ?
Вы же сами получаете: (TextView)customView.findViewById(R.id.textView);
Так зачем return customView, когда можно Текствью и отдавать.

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

public TextView getCustomView(){
    View customView = layoutInflater.inflate(R.layout.custom_view,null, false);
    return  (TextView)customView.findViewById(R.id.textView);
}
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

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

Сообщение Fry » 23 янв 2015, 15:10

Ну вот есть у меня готовый View. Тупо просто есть. Этот код просто иллюстрирует, что View уже создан и передан.

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

Понятно, что можно еще раз найти у View его элементы, и переопледелить их. Но вдруг есть способы по-другом получить к ним доступ.
Arbeit macht Fry

onesoft
Сообщения: 4
Зарегистрирован: 27 фев 2015, 15:11

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

Сообщение onesoft » 27 фев 2015, 15:18

Есть вопрос по этому коду:

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

item.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
Для чего нужно присваивать MATCH_PARENT, если и без этого стоит MATCH_PARENT?

Аватара пользователя
G_i_S
Сообщения: 1
Зарегистрирован: 03 мар 2015, 22:05

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

Сообщение G_i_S » 03 мар 2015, 22:25

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

p00nk
Сообщения: 5
Зарегистрирован: 12 мар 2015, 17:43

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

Сообщение p00nk » 14 апр 2015, 19:00

Подскажите, что я делаю не так? :cry:

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

Компилируется, запускается на эмуляторе и завершается с ошибкой:
Caused by: java.lang.NullPointerException

Путем комментирования части кода выяснил, что ошибка возникает на методе setText уже при первом же обращении в цикле.

Возникает ощущение, что фактически лайаут или вьюшки не создались, и при попытке работать с ними вываливается приложение.

Стандартный скопипащеный item.xml:

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

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_marginTop="10dp">
    <TextView
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:layout_gravity="top|center_horizontal"
        android:textSize="24sp">
    </TextView>
    <TextView
        android:id="@+id/tvPosition"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:layout_gravity="bottom|left"
        android:layout_marginLeft="5dp">
    </TextView>
    <TextView
        android:id="@+id/tvSalary"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:layout_gravity="bottom|right"
        android:layout_marginRight="5dp">
    </TextView>
</FrameLayout>
onCreate:

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

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        colors[0] = Color.parseColor("#559966CC");
        colors[1] = Color.parseColor("#55336699");

        LinearLayout linLayout = (LinearLayout) findViewById(R.id.linLayout);
        LayoutInflater ltInflater = getLayoutInflater();

        TextView tvName, tvPosition, tvSalary;
        View item;

        for (int i = 0; i < name.length; i++)
        {
            Log.d("myLog", "i = " + i);

            item = ltInflater.inflate(R.layout.item, linLayout, false);

            tvName = (TextView)findViewById(R.id.tvName);
            tvName.setText(name[i]);

            tvPosition = (TextView)findViewById(R.id.tvPosition);
            tvPosition.setText("Position: " + position[i]);

            tvSalary = (TextView)findViewById(R.id.tvSalary);
            tvSalary.setText("Salary: " + salary[i]);

            item.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
            item.setBackgroundColor(colors[i % 2]);
            linLayout.addView(item);
        }
    }

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

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

Сообщение Foenix » 14 апр 2015, 19:05

По ссылке в подписи
Гадать не надо
R.id.team

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

p00nk
Сообщения: 5
Зарегистрирован: 12 мар 2015, 17:43

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

Сообщение p00nk » 14 апр 2015, 23:45

Foenix писал(а):По ссылке в подписи
Гадать не надо
Вполне понятно, что раз получил NPE, то пытаюсь работать с NULL объектом.
Вопрос, почему объект NULL?

Переменные объявлены, и View item и TextView tvName (и другие TextView).

item инициализируется:
item = ltInflater.inflate(R.layout.item, linLayout, false);
Не отработал инфлейтер? Почему?

Выводил в лог id для tvName после findViewById, он имел некое определенное многозначное положительное число. Я сделал вывод, что так и должно быть.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 15 апр 2015, 06:47

Неужели так сложно сравнить код урока и свой код и понять что они отличаются? Просто построчно?

p00nk
Сообщения: 5
Зарегистрирован: 12 мар 2015, 17:43

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

Сообщение p00nk » 15 апр 2015, 12:19

klblk писал(а):Неужели так сложно сравнить код урока и свой код и понять что они отличаются? Просто построчно?
Окай. Сравнил. Нашел отличие в одном, у меня переменные были объявлены за телом цикла, а в оригинальном примере переменные объявляются в теле цикла. ОК. Объявляем переменные в теле цикла. И снова NPE.

Изучаем лог.
Ошибка возникает при выполнении метода tvName.setText.

Пытаемся понять что происходит. Дописываем строчки:
Log.d("myLogs", "item.getId(): " + String.valueOf(item.getId()));
Log.d("myLogs", "tvName.getId(): " + String.valueOf(tvName.getId()));


Получаем:
item.getId(): -1
и NPE на второй строке, ибо, вероятно, не удалось вообще получить объект tvName, т.к. не удалось создать item из xml.

Уважаемый klblk, я так понимаю, вы видите в моем коде что-то, что никак не могу заметить я.

На данный момент код выглядит так:

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

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("myLogs", "DEBUG1");

        colors[0] = Color.parseColor("#559966CC");
        colors[1] = Color.parseColor("#55336699");

        LinearLayout linLayout = (LinearLayout) findViewById(R.id.linLayout);
        LayoutInflater ltInflater = getLayoutInflater();

        Log.d("myLogs", "DEBUG1");

        for (int i = 0; i < name.length; i++)
        {
            Log.d("myLogs", "i = " + i);

            View item = ltInflater.inflate(R.layout.item, linLayout, false);
            Log.d("myLogs", "item.getId(): " + String.valueOf(item.getId()));

            TextView tvName = (TextView)findViewById(R.id.tvName);
            Log.d("myLogs", "tvName.getId(): " + String.valueOf(tvName.getId()));
            //tvName.setText(name[i]);

            item.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
            item.setBackgroundColor(colors[i % 2]);
            linLayout.addView(item);
        }
}

p00nk
Сообщения: 5
Зарегистрирован: 12 мар 2015, 17:43

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

Сообщение p00nk » 15 апр 2015, 12:39

Всем спасибо, особенно klblk за науку. Моей невнимательности нет предела!
Надо же не заметить такую важную деталь при наборе кода:

TextView tvName = (TextView) item.findViewById(R.id.tvName);

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

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

Сообщение Foenix » 15 апр 2015, 14:29

а если бы ты послушался меня, то нашел бы эту строчку сразу, не ставя какие-то логи и прочие ненужные вещи.
R.id.team

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

p00nk
Сообщения: 5
Зарегистрирован: 12 мар 2015, 17:43

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

Сообщение p00nk » 15 апр 2015, 16:10

Foenix, и тебе спасибо! Я почитал по ссылкам у тебя в подписи, но оно мне практически не помогло в решении моей проблемы. Не смог заметить ошибку. Я же только начал знакомиться с JAVA и разработкой под Android. И даже самые простые ошибки пока не выявляются "на первый взгляд". Хотя кое-что нового для себя я оттуда, конечно, вынес.

Только по наводке klblk, при посимвольном сравнении, строчка за строчкой, я обнаружил

Ответить