Кажется, ваш фрагмент содержит шаблоны на стороне сервера ({{ head | safe }}
).
То, что вы просите, может быть сделано с использованием только HTML. Поэтому, если вы используете шаблонизацию на стороне сервера, вы можете просто сделать это так. Но дело в том, что даже если вы отображаете его с помощью Javascript в вашем браузере, вам все равно не нужно использовать scrollIntoView()
. Если у вас есть элемент <a>
, который имеет href="#id"
, где id
- это идентификатор элемента другого элемента на странице, браузер будет прокручивать там.
.spacer {
height: 300px;
background-color: black;
}
<ul id="nav">
<li>
<a href="#entry1">entry1</a>
</li>
<li>
<a href="#entry2">entry2</a>
</li>
<li>
<a href="#entry3">entry3</a>
</li>
</ul>
<div class="spacer"></div>
<div id="entry1">entry1</div>
<div class="spacer"></div>
<div id="entry2">entry2</div>
<div class="spacer"></div>
<div id="entry3">entry3</div>
<div class="spacer"></div>
1) Во-первых, давайте посмотрим на простое помещение всего в памяти. Это просто, гибко, и прежде всего, быстро, решение. Недостатки включают то, что необходимо будет читать, все в память при запуске (дайте пользователю симпатичную панель загрузки, и они даже не заметят), и возможно должны сделать немного дополнительной работы, чтобы гарантировать, что все отражается к диску, когда пользователь думает, что это, так, чтобы данные не были потеряны.
В этом анализе я делаю некоторые универсальные предположения о Android/Дальвике, о котором я действительно не знаю так много, так надо надеяться, это несколько точно :) Помните, что G1 имеет 192 МБ RAM. Кроме того, Ваше предположение выше было макс. приблизительно 1 000 объектов.
Object superclass ~ 8 bytes
parent/child pointer ~ 4 bytes
date (long) ~ 8 bytes
name (non interned string avg 32 chars) ~ 64 bytes
x point (int) ~ 4 bytes
y point (int) ~ 4 bytes
Total = 92 bytes + possible memory alignment + fudge factor = 128 bytes
1000 items = 125kB
10000 items = 1.22MB
Примечание: Я понимаю, что, в то время как у ребенка может только быть один указатель, родитель может иметь несколько детей. Однако количество родителя-> указатели на подчиненный элемент (элементы - 1), таким образом, средняя стоимость родителя-> указатель на подчиненный элемент является (элементы - 1) / элементами ~ 1 элемент или 4 байта. Это принимает дочернюю структуру, которая не выделяет неиспользованную память, такую как LinkedList (в противоположность ArrayList)
2) Компьютерный фанат во мне говорит, что это было бы забавным местом для профилирования B + дерево, но я думаю, что это - излишество для того, что Вы хотите в данный момент :) Однако безотносительно решения, которое Вы заканчиваете тем, что приняли, если Вы не держите все в памяти, Вы определенно захотите кэшировать такой большой верхние уровни дерева в памяти, как Вы можете. Это может сократить объем активности диска решительно.
3) Если Вы не хотите идти вся память, другое возможное решение могло бы быть следующие. Bill Karwin предлагает довольно изящную структуру RDBMS, названную Таблицей Закрытия для оптимизации основанных на дереве чтений при создании записей более сложными. Объединение этого с высокоуровневым кэшем может дать Вам выигрыши в производительности, хотя я протестировал бы это прежде, чем взять мое слово на нем:
При оценке представления используйте то, что Вы имеете в памяти для оценки стольких дочерних элементов, сколько Вы можете. Для тех детей, которые не соответствуют, используйте соединение SQL между таблицей закрытия и плоской таблицей с соответствующим где пункт, чтобы узнать, существуют ли какие-либо дети соответствия. Если так, Вы будете отображать тот узел в своем списке результата.
Надеюсь, что это все имеет смысл и кажется, что он работал бы на то, в чем Вы нуждаетесь.
AFAICT можно использовать иерархические запросы (Google для "ПОДКЛЮЧЕНИЯ" "ЗАПУСКАЮТСЯ С") в SQLite...
Это могло бы быть offtopic, но.. Вы рассмотрели использование сериализации?
Буферы Протокола Google могли использоваться для сериализации данных очень эффективным способом (время и пространство), необходимо будет затем создать подходящую древовидную структуру (взгляд в любой книге CS) для помощи с поиском.
Я упомянул буферы протокола, потому что, будучи библиотекой Google они могут быть доступными на Android.
Просто мысль.
I listened to Soonil and gave a try to the « closure table ». I added the following table :
################
# Closure #
################
# ancestor_id #
# item_id #
################
If like me you never used that model before, it works that way :
You add a row for every direct or indirect relationship in the hierarchy. If C is a child of B, and B a child of A, you've got :
ancestor item
B C
A B
A C # you add the indirect relationship
A A
B B
C C # don't forget any item is in relation with himself
Nevertheless, with this scheme, you are missing an important information : what are the direct relationships ? What if you want only the direct children of an item ?
For that, you can add a column is_direct
with a bool in the closure table, or you can just keep the column parent_id
in the item
table. That what I did because it prevents me from rewriting a lot of my previous code.
The nice part is that I can now check if an item matches a date or a geocontext in one single query.
E.G, if I am browsing all the items contained in the item number 4 and want to get only the ones matching or containing a children matching the date D :
SELECT ti.parent_id, ti.id, ti.title
FROM item AS di # item to filter with the date
JOIN closure AS c # closure table
ON (di.id = c.item_id)
JOIN item AS ti
ON (c.ancestor_id = ti.id) # top item to display
WHERE di.date = D # here you filter by date
AND ti.parent_id = 4 # here you ensure you got only the top items
So I can throw away all my *_cache
tables. I still have a lot of work to do one UPDATE / DELETE / CREATE, but everything is centralized and most of it is procedural, not recursive. Pretty cool.
The only pain is that I must recursively add an item to all its ancestor. But getting the ancestors is a one query shot, so it's really reasonable. And of course the closure table take a lot of space, but in my case I just don't care. Don't forget to index it if you are looking for perfs...
Love this SQL trick, thanks a lot guys ! It's a bit tricky to get at first glance, but so obvious once you have it done.