我已经看到了很多关于如何将按字母顺序的节标题添加到在线列表视图的示例。例子:
我从
this website
. 不过,我有一份大约8000件物品的清单。当尝试加载此页面时,大约需要8秒,这显然太慢了。使用普通的字母索引器大约需要1.5秒(仍然很慢,但要好得多)。
有人知道怎么加快速度吗?如果没有,还有比这更快的例子吗?
谢谢!

最佳答案

你想加载页面到底是什么意思?如果只加载项而不进行索引,需要多长时间?8000个项目没有那么多可重复。然而,它可能是从磁盘或Internet加载的许多项。您可能需要考虑在后台显示加载屏幕并读取行的数据。
您显示的代码对于您要做的事情看起来特别复杂。下面是我使用的解决方案。你可以用谷歌搜索SectionIndexer。在我的代码中,itemManager基本上只是列表上的一个抽象,占位符是空值,其他的都是包含行信息的数据结构。省略了一些代码:

//based on http://twistbyte.com/tutorial/android-listview-with-fast-scroll-and-section-index

private class ContactListAdapter extends BaseAdapter implements SectionIndexer {
    final HashMap<String, Integer> alphaIndexer = new HashMap<String, Integer>();
    final HashMap<Integer, String> positionIndexer = new HashMap<Integer, String>();
    String[] sections;

    public ContactListAdapter() {
        setupHeaders();
    }

    public void setupHeaders(){
        itemManager.clearPlaceholders();
        for (int i = 0; i < itemManager.size(); i++) {
            String name = itemManager.get(i).displayName();
            String firstLetter = name.substring(0, 1);
            if (!alphaIndexer.containsKey(firstLetter)) {
                itemManager.putPlaceholder(i);
                alphaIndexer.put(firstLetter, i);
                positionIndexer.put(i, firstLetter);
                ++i;
            }

        }
        final Set<String> sectionLetters = alphaIndexer.keySet();
        final ArrayList<String> sectionList = new ArrayList<String>(sectionLetters);
        Collections.sort(sectionList);
        sections = new String[sectionList.size()];
        sectionList.toArray(sections);
    }

    @Override
    public int getItemViewType(int position) {
        return itemManager.isPlaceholder(position) ? ViewType.HEADER.ordinal() : ViewType.CONTACT.ordinal();
    }

    @Override
    public int getViewTypeCount() {
        return ViewType.values().length;
    }

    @Override
    public int getPositionForSection(int section) {
        return alphaIndexer.get(sections[section]);
    }

    @Override
    public int getSectionForPosition(int position) {
        return 1;
    }

    @Override
    public Object[] getSections() {
        return sections;
    }

09-25 20:46