Android SDKのクラスAdapterのメソッド getItem
および getItemId
の目的に興味があります。
説明から、getItem
は基になるデータを返すはずです。したがって、名前の配列["cat","dog","red"]
があり、それを使用してアダプターa
を作成すると、a.getItem(1)
は「dog」を返す必要がありますか? a.getItemId(1)
は何を返すべきですか?
これらの方法を実際に使用した場合、例を挙げていただけますか?
これらのメソッドは、リストのデータにアクセスするためのよりクリーンなアプローチと考えています。 myListData.get(position)
のようなものを介してアダプタオブジェクトに直接アクセスする代わりに、adapter.get(position)
のようなアダプタを単純に呼び出すことができます。
getItemId
についても同様です。通常、リスト内のオブジェクトの一意のIDに基づいてタスクを実行する場合、このメソッドを使用します。これは、データベースを操作するときに特に役立ちます。返されたid
は、データベース内のオブジェクトへの参照である可能性があり、そのオブジェクトに対して異なる操作(更新/削除/など)を実行できます。
したがって、myListData.get(position).getId()
のような生データオブジェクトからIDにアクセスする代わりに、adapter.getItemId(position)
を使用できます。
これらのメソッドを使用する必要があると感じた一例は、 SeparatedListViewAdapter を使用したプロジェクトでした。このアダプターには、複数の異なる種類のアダプターを含めることができ、それぞれが異なるタイプ(通常)のデータを表します。 SeparatedListViewAdapter
でgetItem(position)
を呼び出す場合、返されるオブジェクトは、送信する位置が「セクション」に応じて異なる場合があります。
たとえば、リストに2つのセクションがある場合(fruitとcandy):getItem(position)
とposition
を使用した場合、たまたまfruitセクションでは、getItem(position)
にposition
を要求した場合とは異なるオブジェクトを受け取りますcandyセクション。次に、getItemId(position)
が返すデータの種類を表すgetItem(position)
にある種の定数ID値を返すか、instanceof
を使用して、所有しているオブジェクトを判別します。
私が言及したこと以外は、これらの方法を本当に使用する必要があると感じたことはありません
まあ、この質問はよりシンプルで簡単な方法で答えられるようです... :-)
簡単に言えば、Androidを使用すると、long
を任意のListView
アイテムに添付できます。これはとても簡単です。システムがユーザーの選択を通知すると、three変数を識別する変数を受け取り、選択内容を通知します。
long
を個々の要素に追加しました。特定のケースでこれら3つのうちどれを扱うのが最も簡単かを決めるのはあなた次第ですが、常に3つすべてを選択する必要があります。このlong
は、アイテムに自動的に添付されたタグであると考えてください。読み取りがさらに簡単で簡単なだけです。
それが通常行うことについての誤解は、単純な慣習に由来します。この3番目のIDを実際に使用しない場合でも、すべてのアダプターはgetItemId()
を提供する必要があります。そのため、慣例により、これらのアダプター(SDKのサンプルまたはWeb全体のサンプルを含む)は、単一の理由でposition
を返すだけです。これは常に一意です。それでも、アダプターがposition
を返す場合、これは本当にこの機能をまったく使用したくないを意味します。とにかくposition
は既に知られているからです。
したがって、適切と思われる他の値を返す必要がある場合は、お気軽にお問い合わせください。
@Override
public long getItemId(int position) {
return data.get(position).Id;
}
getItemId
メソッドは、主にSQLiteデータベースによってサポートされるカーソルで動作するように設計されています。位置1のアイテムの基になるカーソルのidフィールドを返します。
あなたの場合、位置1のアイテムのIDはありません。ArrayAdapterの実装は-1または0を返すと仮定しています。
編集:実際には、位置を返すだけです:この場合は1
。
getItem
とgetItemId
を実装した後、 ListView.getItemAtPosition と ListView.getItemIdAtPosition を使用して、直接データにアクセスできることに言及したいアダプターを通過する。これは、onClickリスナーを実装するときに特に便利です。
getItemId
correctlyを実装すると、非常に便利です。
例:
アルバムのリストがあります:
class Album{
String coverUrl;
String title;
}
そして、次のようにgetItemId
を実装します:
@Override
public long getItemId(int position){
Album album = mListOfAlbums.get(position);
return (album.coverUrl + album.title).hashcode();
}
これで、アイテムIDはcoverUrlおよびtitleフィールドの値に依存し、アダプターを変更してnotifyDataSetChanged()
を呼び出すと、アダプターはgetItemId( )各要素のメソッドとIDが変更されたthouseアイテムのみを更新します
これは、getView()
で「重い」操作を行う場合に非常に便利です。
ところで:これを機能させるには、hasStableIds()
メソッドがfalseを返すことを確認する必要があります。
getItem
またはgetItemId
は、主にリスト内のアイテムを持つデータを添付するために設計された少数のメソッドです。 getItem
の場合、リスト内のアイテムにアタッチするオブジェクトを渡すことができます。通常、人々はnull
を返します。 getItemId
は、リスト内の同じアイテムに添付できる一意のlong
値です。通常、人々はリスト内の位置を返します。
使用は何ですか。さて、これらの値はリスト内のアイテムにバインドされているため、ユーザーがアイテムをクリックするとそれらを抽出できます。これらの値には、AdapterView
メソッドを介してアクセスできます。
// template class to create list item objects
class MyListItem{
public String name;
public long dbId;
public MyListItem(String name, long dbId){
this.name = name;
this.dbId = dbId;
}
}
///////////////////////////////////////////////////////////
// create ArrayList of MyListItem
ArrayList<MyListItem> myListItems = new ArrayList<MyListItem>(10);
// override BaseAdapter methods
@Override
public Object getItem(int position) {
// return actual object <MyListItem>
// which will be available with item in ListView
return myListItems.get(position);
}
@Override
public long getItemId(int position) {
// return id of database document object
return myListItems.get(position).dbId;
}
///////////////////////////////////////////////////////////
// on list item click, get name and database document id
my_list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// extract item data
MyListItem selectedItem = (MyListItem)parent.getItemAtPosition(position);
System.out.println("Your name is : " + selectedItem.name);
// extract database ref id
long dbId = id;
// or you could also use
long dbId = parent.getItemIdAtPosition(position);
}
});