Таблица - слишком долгое создание

Интерфейс, диалоги, темы, стили, меню
Ответить
alu
Сообщения: 53
Зарегистрирован: 06 сен 2013, 13:02

Таблица - слишком долгое создание

Сообщение alu » 22 сен 2013, 03:18

Есть tableLayout таблица динамическая ее размеры меняются в зависимости от выбора пользователя.
Есть один момент - например строк в таблице 16
Столбцов - 8
Каждая ячейка это layout из трех текстовых полей TextView
Так вот генерация этой таблицы происхолит омерзительно долго. И суть тут даже не в данных - для теста я заполнял ее одинаковыми данными.
Что так тяжело работает? Inflate или getViewbyid и можно ли это обойти как нибуть, например просто клонируя .clone() созданный элемент таблицы через inflate. Или все настолько плохо с графикой в Андроиде?

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

Re: Таблица - слишком долгое создание

Сообщение rezak90 » 22 сен 2013, 11:13

alu писал(а):Или все настолько плохо с графикой в Андроиде?
нет
Показывай код, кто ж его знает какую архитектуру ты там построил.
R.id.team
Политика на форуме запрещена

alu
Сообщения: 53
Зарегистрирован: 06 сен 2013, 13:02

Re: Таблица - слишком долгое создание

Сообщение alu » 22 сен 2013, 14:46

rezak90 писал(а):
alu писал(а):Или все настолько плохо с графикой в Андроиде?
нет
Показывай код, кто ж его знает какую архитектуру ты там построил.
вот лейаут элемента таблицы

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="58dp"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        >
    <TextView
            android:id="@+id/textGrid111"
            android:layout_width="25dp"
            android:layout_height="30dp"
            android:textColor="#000000"
            android:textSize="19sp"
            android:maxLines="1"
            android:singleLine="true"
            android:maxWidth="230dp"
            android:editable="false"
            android:phoneNumber="true"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"

            android:gravity="center_vertical|right"
            android:layout_marginLeft="6dp"
            >
    </TextView>
    <LinearLayout
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="2dp">

        <TextView
                android:id="@+id/textGrid222"
                android:layout_width="25dp"
                android:layout_height="15dp"
                android:textColor="#399ae3"
                android:textSize="13sp"
                android:maxLines="1"
                android:singleLine="true"
                android:maxWidth="230dp"
                android:editable="false"
                android:textStyle="bold"
                android:gravity="left|top"
                >
        </TextView>

        <TextView
                android:id="@+id/textGrid333"
                android:layout_width="25dp"
                android:layout_height="15dp"
                android:textColor="#f35a19"
                android:textSize="13sp"
                android:maxLines="1"
                android:singleLine="true"
                android:maxWidth="230dp"
                android:editable="false"
                android:textStyle="bold"
                android:gravity="center_vertical|left"
                >
        </TextView>
    </LinearLayout>

</LinearLayout>
вот функция добавления строки в таблицу. Ничего сверхестественного. Добавляется это к TableLayout который уже существует статично в проекте.
Перед этим в таблице все удаляется - tableView.removeAllViews();
вызывается в цикле (в моем случае 17 раз. Столбцов в таблице как я говорил выше 8)
dif - класс с 2-мя полями (int) newValue и (int) oldValue

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

    
public void addRow(String s,ArrayList<dif> ar){
        TableRow tr=new TableRow(this);
        tr.setGravity(Gravity.CENTER_VERTICAL);
        int w=tableView.getChildCount();
        if(w%2==0){
            tr.setBackgroundColor(0xFFdfdfdf);
        }
        TextView tv=null;
        int i;
        int di;
        View vw=null;
//Этот цикл выполняется 8 раз в примере про который я говорю
        for(i=0;i<ar.size();i++){// todo very very slow, why?
            vw=ltInflater.inflate(R.layout.my_grid_item, null, false);
            vw.setOnClickListener(for_graph);
            vw.setTag(ar.get(i));
            tv=(TextView)vw.findViewById(R.id.textGrid111);
            tv.setText(Integer.toString(ar.get(i).newValue));

            di=ar.get(i).oldValue-ar.get(i).newValue;
            if(ar.get(i).oldValue<1){di=0;}
            if(ar.get(i).newValue<1){di=0;}
            if(di>0){
                ((TextView)vw.findViewById(R.id.textGrid222)).setText("+"+Integer.toString(di));
            }
            if(di<0){
                ((TextView)vw.findViewById(R.id.textGrid333)).setText(Integer.toString(di));
            }
            tr.addView(vw);
        }
        tableView.addView(tr); // Это в TableLayout добавляется строка
    }
я где-то читал что findViewById тяжелый для андроида. Может тогда getChildAt(index) попробовать использовать?
Задержка создания где-то одна-полторы секунды. (Может это нормально для Андроида конечно, но я сомневаюсь)

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

Re: Таблица - слишком долгое создание

Сообщение rezak90 » 22 сен 2013, 16:05

мда... читабельность кода зашкаливает)))
Конечно сделано всё руками, конечно операция addView не лёгкая, findViewById здесь не критична, так же не умеем/знаем как работает ArrayList, каждый раз view создаются.
Я бы посоветовал переписать всё под GridView со своим адаптером. И нет, то что ты написал в андроиде не нормально =)
R.id.team
Политика на форуме запрещена

alu
Сообщения: 53
Зарегистрирован: 06 сен 2013, 13:02

Re: Таблица - слишком долгое создание

Сообщение alu » 22 сен 2013, 16:27

rezak90 писал(а):мда... читабельность кода зашкаливает)))
Конечно сделано всё руками, конечно операция addView не лёгкая, findViewById здесь не критична, так же не умеем/знаем как работает ArrayList, каждый раз view создаются.
Я бы посоветовал переписать всё под GridView со своим адаптером. И нет, то что ты написал в андроиде не нормально =)
Про читабельность согласен, но пока это еще не важно.

"так же не умеем/знаем как работает ArrayList"
тут по-подробней.. Что имелось ввиду?

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

Re: Таблица - слишком долгое создание

Сообщение rezak90 » 22 сен 2013, 16:34

alu писал(а):"так же не умеем/знаем как работает ArrayList"
тут по-подробней.. Что имелось ввиду?
то что всё время идёт обращение к коллекции, а гораздо быстрее было бы получить экземпляр нужного элемента и обращаться к нему на прямую, коллекция всего на из 8 элементов, но всё таки пару микросекунд это сократило бы =)
R.id.team
Политика на форуме запрещена

alu
Сообщения: 53
Зарегистрирован: 06 сен 2013, 13:02

Re: Таблица - слишком долгое создание

Сообщение alu » 22 сен 2013, 17:04

rezak90 писал(а):
alu писал(а):"так же не умеем/знаем как работает ArrayList"
тут по-подробней.. Что имелось ввиду?
то что всё время идёт обращение к коллекции, а гораздо быстрее было бы получить экземпляр нужного элемента и обращаться к нему на прямую, коллекция всего на из 8 элементов, но всё таки пару микросекунд это сократило бы =)
Ок. Повторяющиеся расчеты из цикла вынесу.
Я так и делаю в других местах, это был так сказать первый опыт.

Ответить