2012-10-19 6 views
22

postionrow idの違いについては、ListActivity.onListItemClick()に混乱しています。onListItemClick()の位置と行IDの実際の相違

マニュアルは、次があります。

position The position of the view in the list 
id  The row id of the item that was clicked 

は、両者の間の任意の実用的な違いはありますか?私は、2つの異なるパラメータがあるので、値が異なる状況がありますが、ドキュメントで使用されている言葉に基づいて、その違いが何であるかは分かりません。そのうちの1人がCursorまたはその他の特殊機能によって提供されるデータベース行IDの値を保持できるのでしょうか?

+2

は、リストを並べ替え言います。それから、その位置はIDとは非常に異なるでしょう。位置は上から下、idは一意の識別子です。 –

+0

一意の識別子はどのように割り当てられますか?並べ替えのような操作が行われる前に、ListViewのアイテムの順序が最初に設定されたときの順序ですか? –

答えて

30

位置:リスト内のビューの位置
ID:位置0から始まる

クリックされたアイテムの行ID、の上から下へ適切な行IDを取得するには、アダプタに渡されたカーソルに、表の各行の一意のIDを表す '_id'という列が含まれていることが重要です。

ArrayAdapterを使用している場合、positionidは同じになります。 IDはAdapter.getItemId(int)の戻り値になります。したがって、ArrayAdapterを使用する場合は、位置と同じになります。ArrayAdapterソースコードのクイック検索は、戻り位置を使用していることを示します。 IDを調べる

+0

テーブルに '_id'フィールドが含まれていない場合は、位置と行IDが同じであると言うのが安全でしょうか? –

+4

arrayAdapterを使用している場合は同じであると考えられます。 idは、Adapter.getItemId(int)の戻り値になります。したがって、ArrayAdapterを使用する場合は、位置と同じになります。ArrayAdapterソースコードのクイック検索は、戻り位置を使用していることを示します。 id: –

+3

これは、ヘッダービューで 'ListView'を持つ場合を見落とします。その場合、position = id + 1. [私の答えを見る](http://stackoverflow.com/a/24531354/383414) –

24

answer by Lazy Ninjaはほとんど正しいですが、ListView.addHeaderView(View)メソッドを呼び出すことによってヘッダービューが追加されたArrayAdapterを使用する場合は見落とされます。あなたのリストは、ヘッダーアイテムを持っている場合、それは位置0

になりますが、だから、リストの最初の "本当" の項目があります:

  • position = 1
  • id =一般的に0

、= idposition + number_of_header_views


これは、あなたがすでに正常に動作しているコードのリストにヘッダビューを追加することを決定した場合に実現することが重要です。

あなたがpositionを使用して、あなたのアイテムにアクセスしている場合は、あなたのコードは次の行に沿って更新する必要があります:

  • 代わりにインデックス
  • 使用ListView.getItemAtPosition(int)として指数
  • 使用idとして使用position - 1Adapter.getItem(int)

また、関連する議論についてこの質問を参照してください。

+2

あなたが投稿した相違点は、listviewをヘッダで理解することに非常に重要なポイントです。あなたの追加の答えはここにたくさん.. – Kushal

関連する問題