Формы списков

Выборка данных

Если требуется изменить выборку данных, например, установить отбор или сортировку, достаточно переопределить метод select:

1
2
3
4
5
6
@Override
protected List<DocumentZakazPokupatelya> select(
                RowDao<DocumentZakazPokupatelya> dao) throws SQLException {
        //Сортировка по дате в обратном порядке
        return dao.select(null, DocumentZakazPokupatelya.FIELD_NAME_DATE + " DESC");
}
@Override
protected List<DocumentZakazPokupatelya> select(
            	RowDao<DocumentZakazPokupatelya> dao) throws SQLException {
        //Сортировка по дате в обратном порядке
    	return dao.select(null, DocumentZakazPokupatelya.FIELD_NAME_DATE + " DESC");
}

Простой отбор на равенство:

1
2
3
4
5
6
7
8
9
10
@Override
protected List<DocumentZakazPokupatelya> select(
                RowDao<DocumentZakazPokupatelya> dao) throws SQLException {
 
        //выбрать только проведенные
        HashMap<String,Object> filter = new HashMap<String, Object>();
        filter.put(DocumentZakazPokupatelya.FIELD_NAME_POSTED, true);
 
        return dao.select(filter);
}
@Override
protected List<DocumentZakazPokupatelya> select(
            	RowDao<DocumentZakazPokupatelya> dao) throws SQLException {

    	//выбрать только проведенные
    	HashMap<String,Object> filter = new HashMap<String, Object>();
    	filter.put(DocumentZakazPokupatelya.FIELD_NAME_POSTED, true);

    	return dao.select(filter);
}

И естественно можно использовать всю мощь OrmLite по построению запросов, например:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
protected List<DocumentZakazPokupatelya> select(
                RowDao<DocumentZakazPokupatelya> dao) throws SQLException {
 
        //Выбрать 3 не проведённых документа, у которых дата >= 01/05/13
        QueryBuilder<DocumentZakazPokupatelya,String> builder = dao.queryBuilder();
        builder.where().ge(DocumentZakazPokupatelya.FIELD_NAME_DATE, DateHelper.date(2013, Calendar.MAY , 1));
        builder.orderBy(DocumentZakazPokupatelya.FIELD_NAME_DATE, false);
        builder.limit(3L);
 
        return dao.query(builder.prepare());
 
}
@Override
protected List<DocumentZakazPokupatelya> select(
            	RowDao<DocumentZakazPokupatelya> dao) throws SQLException {

    	//Выбрать 3 не проведённых документа, у которых дата >= 01/05/13
    	QueryBuilder<DocumentZakazPokupatelya,String> builder = dao.queryBuilder();
    	builder.where().ge(DocumentZakazPokupatelya.FIELD_NAME_DATE, DateHelper.date(2013, Calendar.MAY , 1));
    	builder.orderBy(DocumentZakazPokupatelya.FIELD_NAME_DATE, false);
    	builder.limit(3L);

    	return dao.query(builder.prepare());

}

Колонки списка

Теперь покажем как изменить состав колонок нашего списка. Сделаем вывод номера документа, контрагента и суммы. Создайте макет для заголовков колонок doc_zakaz_list_header.xml:

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
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ccc"
    android:divider="?android:dividerVertical"
    android:dividerPadding="1dp"
    android:orientation="horizontal"
    android:padding="3dp"
    android:showDividers="middle" >
 
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="4"
        android:gravity="center_horizontal"
        android:text="@string/number"
        android:textAppearance="?android:attr/textAppearanceMedium" />
 
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:gravity="center_horizontal"
        android:text="@string/kontragent"
        android:textAppearance="?android:attr/textAppearanceMedium" />
 
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="4"
        android:gravity="center_horizontal"
        android:text="@string/summa"
        android:textAppearance="?android:attr/textAppearanceMedium" />
 
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ccc"
    android:divider="?android:dividerVertical"
    android:dividerPadding="1dp"
    android:orientation="horizontal"
    android:padding="3dp"
    android:showDividers="middle" >

	<TextView
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:layout_weight="4"
    	android:gravity="center_horizontal"
    	android:text="@string/number"
    	android:textAppearance="?android:attr/textAppearanceMedium" />

	<TextView
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:layout_weight="3"
    	android:gravity="center_horizontal"
    	android:text="@string/kontragent"
    	android:textAppearance="?android:attr/textAppearanceMedium" />

	<TextView
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:layout_weight="4"
    	android:gravity="center_horizontal"
    	android:text="@string/summa"
    	android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

Затем макет для строк списка doc_zakaz_list_row.xml:

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
27
28
29
30
31
32
33
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="?android:dividerVertical"
    android:orientation="horizontal"
    android:paddingLeft="3dp"
    android:paddingRight="3dp"
    android:showDividers="middle" >
 
    <TextView
        android:id="@+id/tvNumber"
        style="@style/SimpleListItemView"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_weight="4"
        android:textSize="12sp" />
 
    <TextView
        android:id="@+id/tvKontragent"
        style="@style/SimpleListItemView"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:textSize="12sp" />
    <TextView
        android:id="@+id/tvSumma"
        style="@style/SimpleListItemView"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_weight="4"
        android:gravity="right" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="?android:dividerVertical"
    android:orientation="horizontal"
    android:paddingLeft="3dp"
    android:paddingRight="3dp"
    android:showDividers="middle" >

	<TextView
    	android:id="@+id/tvNumber"
    	style="@style/SimpleListItemView"
    	android:layout_width="fill_parent"
    	android:layout_height="match_parent"
    	android:layout_weight="4"
    	android:textSize="12sp" />

	<TextView
    	android:id="@+id/tvKontragent"
    	style="@style/SimpleListItemView"
    	android:layout_width="fill_parent"
    	android:layout_height="match_parent"
    	android:layout_weight="3"
    	android:textSize="12sp" />
	<TextView
    	android:id="@+id/tvSumma"
    	style="@style/SimpleListItemView"
    	android:layout_width="fill_parent"
    	android:layout_height="match_parent"
    	android:layout_weight="4"
    	android:gravity="right" />
</LinearLayout>

Обратите внимание на идентификаторы tvNumber, tvKontragent и tvSumma. Они нам дальше потребуются.

В классе DocZakazListActivity переопределите методы:

1
2
3
4
5
6
7
8
9
@Override
protected int getHeaderLayoutResource() {
        return R.layout.doc_zakaz_list_header;
}
 
@Override
protected int getRowLayoutResource() {
        return R.layout.doc_zakaz_list_row;
}
@Override
protected int getHeaderLayoutResource() {
    	return R.layout.doc_zakaz_list_header;
}

@Override
protected int getRowLayoutResource() {
    	return R.layout.doc_zakaz_list_row;
}

Первый возвращает идентификатор макета, используемый для заголовков колонок (если заголовки не нужны возвращать 0) , а второй идентификатор макета для строк списка.

Далее переопределяем методы:

1
2
3
4
5
6
7
8
9
10
11
@Override
protected String[] getFieldNames() {
        return new String[] { DocumentZakazPokupatelya.FIELD_NAME_NUMBER,
                        DocumentZakazPokupatelya.FIELD_NAME_KONTRAGENT,
                        DocumentZakazPokupatelya.FIELD_NAME_SUMMA };
}
 
@Override
protected int[] getFieldIds() {
        return new int[] { R.id.tvNumber, R.id.tvKontragent, R.id.tvSumma };
}
@Override
protected String[] getFieldNames() {
    	return new String[] { DocumentZakazPokupatelya.FIELD_NAME_NUMBER,
                    	DocumentZakazPokupatelya.FIELD_NAME_KONTRAGENT,
                    	DocumentZakazPokupatelya.FIELD_NAME_SUMMA };
}

@Override
protected int[] getFieldIds() {
    	return new int[] { R.id.tvNumber, R.id.tvKontragent, R.id.tvSumma };
}

В первом указываем поля класса (реквизиты объекта в терминах 1с) отображаемые в списке, а во втором методе – идентификаторы view-элементов для отражения этих значений, т.е. наши созданные ранее:  tvNumber, tvKontragent и tvSumma. Проверим:

Номер и сумма отображаются, а в колонке «Контрагент» пусто. Это потому, что реквизит «kontragent» в классе DocumentZakazPokupatelya ссылочного типа т.е ссылка на справочник «Контрагенты».

По умолчанию, при выборке данных из таблицы ссылочные реквизиты не считываются т.к. это затратная операция и может существенно повлиять на производительность. Получается, что объект kontragent есть, а все поля у него кроме ссылки  = null. Как же считать объект? Возможны два варианта:

1. Автоматическое обновление ссылочных полей.Необходимо установить foreignAutoRefresh = true в аннотации нашего реквизита:

1
2
3
4
5
6
/**
 * Контрагент
 */
@DatabaseField(columnName = FIELD_NAME_KONTRAGENT, foreign = true, foreignAutoRefresh = true)
@MetadataField(type=MetadataFieldType.REF,name="Контрагент",description="Контрагент")
public CatalogKontragenti kontragent;
/**
 * Контрагент
 */
@DatabaseField(columnName = FIELD_NAME_KONTRAGENT, foreign = true, foreignAutoRefresh = true)
@MetadataField(type=MetadataFieldType.REF,name="Контрагент",description="Контрагент")
public CatalogKontragenti kontragent;

Самый простой, но и самый медленный вариант. Ссылочное поле будет считываться всегда при любой выборке значений, даже если оно вам и не требуется. Рекомендуется устанавливать только для реквизитов, к которым вы обращаетесь чаще всего. Этот флаг может быть установлен автоматически для всех ссылочных объектов при генерации шаблона мобильного приложения из 1С – включить флаг «Автоматическое обновление ссылочных полей» на закладке «Генератор таблиц».

2. Ручное обновление ссылочных полей (по требованию). Чтобы считать ссылочный объект необходимо выполнить метод Refresh DAO-менеджера этого справочника:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
protected List<DocumentZakazPokupatelya> select(
                RowDao<DocumentZakazPokupatelya> dao) throws SQLException {
 
        CatalogKontragentiDao kontrDao = new CatalogKontragentiDao(getConnectionSource());
 
// Обновление ссылочного поля «Контрагент»
        List<DocumentZakazPokupatelya> lst = super.select(dao);
        for(DocumentZakazPokupatelya doc: lst){
                kontrDao.refresh(doc.kontragent);
        }
        return lst;
}
@Override
protected List<DocumentZakazPokupatelya> select(
            	RowDao<DocumentZakazPokupatelya> dao) throws SQLException {

    	CatalogKontragentiDao kontrDao = new CatalogKontragentiDao(getConnectionSource());

// Обновление ссылочного поля «Контрагент»
    	List<DocumentZakazPokupatelya> lst = super.select(dao);
    	for(DocumentZakazPokupatelya doc: lst){
            	kontrDao.refresh(doc.kontragent);
    	}
    	return lst;
}

Показан последовательный перебор элементов выборки и обновление ссылочных полей. Выбор варианта за вами, результат одинаков:

Похожие записи: