回答:
私はこれらのメソッドを、リストのデータにアクセスするためのよりクリーンなアプローチと見なしています。のようなものを介して直接アダプタオブジェクトにアクセスする代わりに、のようmyListData.get(position)
にアダプタを呼び出すだけadapter.get(position)
です。
同じことがについても言えgetItemId
ます。通常、リスト内のオブジェクトの一意のIDに基づいてタスクを実行する場合に、このメソッドを使用します。これは、データベースを操作するときに特に役立ちます。返さid
れたものは、データベース内のオブジェクトへの参照である可能性があり、そのオブジェクトに対してさまざまな操作(更新/削除など)を実行できます。
したがって、myListData.get(position).getId()
使用できるように生データオブジェクトからIDにアクセスする代わりにadapter.getItemId(position)
。
これらのメソッドを使用する必要があると感じた例の1つは、SeparatedListViewAdapterを使用するプロジェクトです。このアダプターには複数の異なる種類のアダプターを含めることができ、それぞれが異なるタイプ(通常)のデータを表します。呼び出すときgetItem(position)
にSeparatedListViewAdapter
、返されるオブジェクトは、位置は、あなたがそれを送ることである「セクション」に応じて異なる場合があります。
たとえば、リストに2つのセクション(フルーツとキャンディー)がある場合:フルーツセクションのアイテムを使用getItem(position)
していposition
た場合、キャンディーのアイテムをポイントしてリクエストした場合とは異なるオブジェクトを受け取ります。セクション。次に、どのような種類のデータが返されているかを表す、ある種の定数ID値を返すか、または使用して、どのオブジェクトを持っているかを判別します。getItem(position)
position
getItemId(position)
getItem(position)
instanceof
私が述べたこと以外に、私はこれらの方法を使用する必要が本当にあると感じたことはありません
getView
、getCount
、getViewTypeCount
、などを具体的に正しくリストビューのUIを示すために使用されています。その他の機能だけでヘルプが、私は頻繁に使用するが、そのようなアイテムをクリックすると、さらにアクションを実行するなど、他の機能などを実装作成getItem
の内側getView
getItemId
返す0L
かnull
、どこでも使用しないのが安全です。UUIDがlong
IDの単なる値よりも価値がある理由は明らかではありません。切断モード?あれは何でしょう?
さて、この質問はより簡単で簡単な方法で答えられるようです... :-)
簡単に言うと、Androidではlong
任意のListView
アイテムにをアタッチできます。これはとても簡単です。システムがユーザーの選択を通知すると、何が選択されたかを示す3つの識別変数を受け取ります。
long
を個々の要素にアタッチしました。特定のケースでこれらの3つのうちどれが最も扱いやすいかを決めるのはあなた次第ですが、常に3つすべてを選択する必要があります。これlong
は、アイテムに自動的に添付されるタグと考えてください。それだけでなく、読みやすくなっています。
それが通常何をするかについての誤解は、単純な慣習から生じます。すべてのアダプターは、getItemId()
実際にはこの3番目のIDを使用しない場合でも、提供する必要があります。したがって、慣例により、これらのアダプター(SDKのサンプルやWeb全体のサンプルを含む)position
は、1つの理由で単純に戻ります。それは常に一意であるためです。それでも、アダプターがを返した場合position
、これは本当に既知の機能なので、この機能をまったく使用しないことを意味しposition
ます。
したがって、適切と思われる他の値を返す必要がある場合は、遠慮なくそうしてください。
@Override
public long getItemId(int position) {
return data.get(position).Id;
}
getItemId()
...カスタムアダプターでこのメソッドがオーバーライドされない場合/場合はどうなりますか?
このgetItemId
メソッドは、主にSQLiteデータベースによってサポートされているカーソルで動作するように設計されています。これは、位置1のアイテムの基になるカーソルのIDフィールドを返します。
あなたの場合、1の位置に項目のIDはありません。私はArrayAdapterの実装が-1または0を返すだけだと想定しています。
編集:実際には、それは単に位置を返します:この場合1
。
-1
。ここに実装がありますassert false : "TODO"; return -1;
実装後getItem
、ListView.getItemAtPositionとListView.getItemIdAtPositionをgetItemId
使用して、アダプターを経由する代わりに、直接データにアクセスできることを述べておきます。これは、onClickリスナーを実装するときに特に役立ちます。
getItemId
正しく実装すると、非常に役立つ場合があります。
例:
アルバムのリストがあります:
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フィールドとタイトルフィールドの値に依存するようになり、変更しnotifyDataSetChanged()
てアダプターを呼び出すと、アダプターは各要素のgetItemId()メソッドを呼び出し、IDが変更されたthouseアイテムのみを更新します。
これは、で「重い」操作を行う場合に非常に役立ちますgetView()
。
ところで:これを機能させるには、hasStableIds()
メソッドがfalseを返すことを確認する必要があります。
hasStableIds()
false を返す必要があるのですか?同じ文字列から計算されたハッシュコードは毎回同じ値を返すように思えます。これはドキュメントによれば安定したID です。
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);
}
});
getItemId()
でArrayAdapter()
は常に返し-1
てassert false : "TODO"; return -1;