Гость
Форумы / Android [игнор отключен] [закрыт для гостей] / setViewValue с точки зрения производительности / 12 сообщений из 12, страница 1 из 1
17.11.2014, 23:16
    #38808913
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setViewValue с точки зрения производительности
Иду дальше на пути визуализации данных из базы.
Когда в ListView Item только текстовые метки, то особых проблем нет. Много, конечно, ручками всё равно.

Столкнулся с тем, что если в ListView Item, кроме текстовых меток, есть ещё и 2 переключателя (Checkbox), то приходится писать свой лисапед. Неужели всегда и везде в Android`е каждый разработчик должен то там, то здесь писать свой лисапед? Ну да ладно, это эмоции.

У меня вопрос по этим самым переключателям.
В базе данных SQLite в таблице, кроме текстовых полей, есть 2 колонки типа Int, там хранится 0 или 1.
Теперь в ListView Item тоже нужно вывести 2 переключателя.
Почитав, посмотрев примеры, я написал такой код.
Меня волнует, с точки зрения производительности правильный ли он? И вообще, правильный ли он?
Состояние переключателей отображает корректно.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    class MyViewBinder implements SimpleCursorAdapter.ViewBinder{

        boolean b = false;
        int i;
        CheckBox cb;

        @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {

            if (columnIndex == 3) {
                cb = (CheckBox) view.findViewById(R.id.checkProductNetwork);// checkProductNetwork - переключатель
                i = cursor.getInt(columnIndex);
                if (i == 1) b = true; else b = false;
                cb.setChecked(b);
                return true;
            }
            if (columnIndex == 6) {
                cb = (CheckBox) view.findViewById(R.id.checkProductCorp);// checkProductCorp - переключатель
                i = cursor.getInt(columnIndex);
                if (i == 1) b = true; else b = false;
                cb.setChecked(b);
                return true;
            }
            return false;
        }
    }



меня волнует вот эти куски кода
columnIndex == 3
и
columnIndex == 6
а если порядок полей поменяется?
как сделать привязку по имени поля?

на сколько я знаю, то findViewById - не самый быстрый метод, может можно заменить?
...
Рейтинг: 0 / 0
17.11.2014, 23:41
    #38808927
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setViewValue с точки зрения производительности
Упростил немного код, убрав лишние переменные

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    class MyViewBinder implements SimpleCursorAdapter.ViewBinder{

        CheckBox cb;

        @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {

            if (columnIndex == 3) {
                cb = (CheckBox) view.findViewById(R.id.checkProductNetwork);
                cb.setChecked(cursor.getInt(columnIndex) != 0);
                return true;
            }
            if (columnIndex == 6) {
                cb = (CheckBox) view.findViewById(R.id.checkProductCorp);
                cb.setChecked(cursor.getInt(columnIndex) != 0);
                return true;
            }
            return false;
        }
    }
...
Рейтинг: 0 / 0
17.11.2014, 23:58
    #38808940
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setViewValue с точки зрения производительности
А почему не сделать так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    class MyViewBinder implements SimpleCursorAdapter.ViewBinder{

        CheckBox cb;

        @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            switch (view.getId()){
               case  R.id.Column3: 
                    cb = (CheckBox) view.findViewById(R.id.checkProductNetwork);
                    cb.setChecked(cursor.getInt(columnIndex) != 0);
                    return true;
                case  R.id.Column6:
                    cb = (CheckBox) view.findViewById(R.id.checkProductCorp);
                    cb.setChecked(cursor.getInt(columnIndex) != 0);
                    return true;
            }
            return false;
        }
    }

[/quot]
...
Рейтинг: 0 / 0
18.11.2014, 00:09
    #38808948
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setViewValue с точки зрения производительности
Да, можно и так. Сильно от єтого ничего не меняется
...
Рейтинг: 0 / 0
18.11.2014, 03:16
    #38808986
pand
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setViewValue с точки зрения производительности
X11,
Есть еще такая технология отображения listview.

http://stackoverflow.com/questions/18162931/get-selected-item-using-checkbox-in-listview
использовал на относительно больших и часто меняющихся списках ( выбор товаров разбитых по группам для заполнения заказа )
...
Рейтинг: 0 / 0
18.11.2014, 03:20
    #38808987
pand
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setViewValue с точки зрения производительности
X11меня волнует вот эти куски кода
columnIndex == 3
и
columnIndex == 6
а если порядок полей поменяется?
как сделать привязку по имени поля?


cursor.getColumnName(int columnIndex)
...
Рейтинг: 0 / 0
18.11.2014, 09:24
    #38809076
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setViewValue с точки зрения производительности
X11,

для производительности ползания по большим датасетам я использую такую штуку http://habrahabr.ru/post/154931/ только слегка допилив до стандарта, добавив в QuckAdapter
Код: java
1.
2.
3.
4.
5.
@Override
public void notifyDataSetChanged() {
    doQuery();
    super.notifyDataSetChanged();
}


И еще: чтоб не ползать через findbyview используй ViewHolder .

Индекс колонок лучше запоминать при первом открытии базы. Во время работы программы они не поменяются.
...
Рейтинг: 0 / 0
18.11.2014, 20:21
    #38810086
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setViewValue с точки зрения производительности
pandcursor.getColumnName(int columnIndex)

так надо же наоборот - узнать columnIndex по имени поля
...
Рейтинг: 0 / 0
18.11.2014, 21:20
    #38810139
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setViewValue с точки зрения производительности
wadmanИндекс колонок лучше запоминать при первом открытии базы. Во время работы программы они не поменяются.

И где и как правильно это сделать?
Как вообще получить индекс колонок?
...
Рейтинг: 0 / 0
18.11.2014, 21:23
    #38810141
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setViewValue с точки зрения производительности
Ну, в принципе этот подход неплохой

Код: sql
1.
2.
switch (view.getId()){
               case  R.id.Column3: 



или
Код: sql
1.
if (view.getId() == R.id.checkProductNetwork)
...
Рейтинг: 0 / 0
18.11.2014, 22:18
    #38810163
pand
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setViewValue с точки зрения производительности
X11pandcursor.getColumnName(int columnIndex)

так надо же наоборот - узнать columnIndex по имени поля
Вы доку читали ? Вот Вам наоборот

getColumnIndex(String columnName)

Returns the zero-based index for the given column name, or -1 if the column doesn't exist.
...
Рейтинг: 0 / 0
18.11.2014, 22:28
    #38810167
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
setViewValue с точки зрения производительности
pandВы доку читали ?

да
просто под вечер, после работы уже того %)

спасибо
...
Рейтинг: 0 / 0
Форумы / Android [игнор отключен] [закрыт для гостей] / setViewValue с точки зрения производительности / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]