Мое решение:
values / dimens.xml:
<resources>
<dimen name="grip_view_entry_size">160dp</dimen>
<dimen name="grip_view_spacing">10dp</dimen>
</resources>
layout / gridview.xml
<GridView android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:numColumns="auto_fit"
android:verticalSpacing="@dimen/grip_view_spacing"
android:horizontalSpacing="@dimen/grip_view_spacing"
android:stretchMode="columnWidth"
android:gravity="center"
android:scrollingCache="false"
android:fastScrollEnabled="true"
android:animationCache="false"/>
в вашем фрагменте:
private void refreshGridView() {
int gridViewEntrySize = getResources().getDimensionPixelSize(R.dimen.grip_view_entry_size);
int gridViewSpacing = getResources().getDimensionPixelSize(R.dimen.grip_view_spacing);
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
int numColumns = (display.getWidth() - gridViewSpacing) / (gridViewEntrySize + gridViewSpacing);
gridView.setNumColumns(numColumns);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
refreshGridView();
}
@Override
public void onResume() {
super.onResume();
refreshGridView();
}
Это подсказка компилятору, что функция / процедура должна быть (если возможно) встроенной, т.е. когда вы ее вызываете, она должна разворачиваться как макрос, а не вызываться.
Это оптимизация для (очень) небольших функций, где накладные расходы на вызов могут быть значительными. Вы найдете множество примеров, например, в windows.pas
. То, что происходит на самом деле, зависит от сложности функции, публичного / частного доступа и вашей версии Delphi.
Другие ответили, что делает inline, но я просто хотел указать, что есть опция Compiler для включения, выключения или автоматического включения inline. Ознакомьтесь с «Процедурами и функциями вызова» в документации D2009 для очень хорошего объяснения механики inline. Вот ссылка на онлайн-документы:
Он заимствован из C в том смысле, что он сообщает компилятору, что это короткая процедура, которая часто вызывается, и рекомендует компилятору рассматривать функцию как макрос и интегрировать код функции непосредственно в программа в вызываемой точке вместо использования вызова функции.
Это дает более быстрый код, потому что нет накладных расходов на вызов функции, но за счет более крупной программы. Также обратите внимание, что, как и в C, это рекомендация компилятору, на самом деле это не обязательно, и оптимизатор может вас отвергнуть.
Где это сделать? Ну, как и разматывание петли, это метод, который сейчас очень редко используется. Классическое место для использования - это глубоко вложенная структура, которая критична в реальном времени, например, рендеринг кода в графическом приложении, где несколько машинных вызовов, сокращаемых на каждой итерации, могут увеличить частоту обновления экрана.
Он сообщает компилятору сгенерировать код для встроенной подпрограммы ; в том месте, где она вызывается, вместо перехода к подпрограмме и обратно.
Для процедур, которые переводятся в очень короткий ассемблер, это может быть преимуществом для производительности, поскольку фактический код относительно короткий по сравнению с подготовкой параметров, фактическим вызовом и прологом / эпилогом процедуры.
Если процедура слишком длинная, это может тормозить производительность, и гигантски взорвать ваш код.