我知道SimpleArrayMapArrayMap类是为HashMap进行更高效的替换(用于少量项目)。 HashMap没有可预测的迭代顺序(与LinkedHashMap不同),但是我注意到SimpleArrayMapArrayMap类中的一些方法使我相信它们可以。

诸如keyAt(int index)valueAt(int index)removeAt(int index)之类的方法似乎表明SimpleArrayMapArrayMap以可预测的方式存储其项目。这些方法也将使访问这些项目变得非常方便,因此我在ArrayMap中添加了FragmentPagerAdapter来保存每个页面的标题和片段:

public class TabPagerAdapter extends FragmentPagerAdapter {

    private final ArrayMap<CharSequence, Fragment> mData = new ArrayMap();

    public TabPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    public void addPage(CharSequence title, Fragment fragment) {
        mData.put(title, fragment);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mData.keyAt(position);
    }

    @Override
    public Fragment getItem(int position) {
        return mData.valueAt(position);
    }

    @Override
    public int getCount() {
        return mData.size();
    }

}


尽管在实践中我注意到getPageTitle()getItem()返回的项目并不总是按照我将它们添加到ArrayMap的顺序进行的。但是,如果这些项目的索引不可预测,那么为什么这些类将具有按索引返回键和值的方法(而不仅仅是使用Map#get(Object key)方法)?

SimpleArrayMapArrayMap是否要保留顺序?难道我做错了什么?或者,如果没有,为什么它们包含上述方法?

最佳答案

看完SimpleArrayMap实现后,当调用put,putAll或remove方法时,它似乎会动态增长和收缩。届时您的索引可能会更改。如果您在看跌期权之后致电notifyDataSetChanged(),您可能会有更好的时间。现在,这仅是我对您的代码的推理,因此无法保证。 :)

更仔细地看,indexOf方法需要在假定的项目索引周围进行搜索,因为在缩小地图时,似乎无法更新键哈希到索引的内部数组。因此索引显然可以改变。

int index = ContainerHelpers.binarySearch(mHashes, N, hash);

// If the hash code wasn't found, then we have no entry for this key.
if (index < 0) {
    return index;
}

// If the key at the returned index matches, that's what we want.
if (key.equals(mArray[index<<1])) {
   return index;
}

// Search for a matching key after the index.
int end;
for (end = index + 1; end < N && mHashes[end] == hash; end++) {
    if (key.equals(mArray[end << 1])) return end;
}

// Search for a matching key before the index.
for (int i = index - 1; i >= 0 && mHashes[i] == hash; i--) {
    if (key.equals(mArray[i << 1])) return i;
}

// Key not found -- return negative value indicating where a
// new entry for this key should go.  We use the end of the
// hash chain to reduce the number of array entries that will
// need to be copied when inserting.
return ~end;


索引方法可能适用于您知道地图未发生任何修改的用法。

更新:
为了做到这一点,您需要实现
同样是public long getItemId(int position),因为您的职位不会为您提供稳定的商品ID。

我想说的是,如果您期望对基础地图进行更改,那么使用索引方法可能不是您的最佳选择,因为必须更新缓存的索引。

10-08 17:05