SimpleArrayMap
とArrayMap
のクラスは、HashMap
の方がより効率的(少数品目)の置換であることを意味しています。 HashMap
は予測可能な反復順序(LinkedHashMap
とは異なります)を持っていませんが、SimpleArrayMap
とArrayMap
クラス内のいくつかの方法が気付いています。 keyAt(int index)
、valueAt(int index)
とremoveAt(int index)
などのSimpleArrayMapとArrayMapは注文を保持するためのものですか?
方法はSimpleArrayMap
とArrayMap
は予測可能な方法でその項目を格納ことを示しているように見えます。また、これらの方法は、それらの項目にアクセスすることが非常に便利になるだろうので、私は、各ページのタイトルとフラグメントを保持するためにFragmentPagerAdapter
にArrayMap
を追加しました:
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)
メソッドを使用するのではなく)、インデックスでキーと値を返すメソッドを持つのはなぜですか?
SimpleArrayMap
とArrayMap
は注文を保留するものですか?私は何か間違っているのですか?あるいは、もしそうでなければ、なぜ彼らは前述の方法を含んでいますか?
'put()'を呼び出した後に 'notifyDataSetChanged()'を呼び出すことはスマートになります。これまでのところ、私は 'ViewPager'でアダプタを設定する前にアイテムを追加しただけなので、現在のコードには違いはありません。 – Bryan
あなたの推論では、これは非常に直感的ではないようです。それらのキーが挿入順序から変更できる場合、各挿入後にすべてのキーに対して 'indexOfKey() 'を呼び出すだけで、どのキーが各キーと値のペアに属するかを知る唯一の方法になります。これは、すべてのインデックスを完全に無用にして、本質的に 'indexOfKey()'を値にアクセスする中途半端にしているようです。そのような中間者がいなくても、 'get(Object key)'メソッドはそうすることができます。 – Bryan
さて、はい。マップを変更する場合は、索引のリストを再構築する必要があります。私が言っていることは、基本的な配列が順序を保持することは保証されていないということです。しかし、オブジェクトが特定のインデックスに存在し、マップが変更されていないことが既に分かっている場合は、そのインデックスを使用できます。 –