 <p>Although @Sam's suggestions will work fine in most scenarios, I actually prefer using the supplied <code>AdapterView</code> in <code>onItemClick(...)</code> for this:</p> <pre><code>public void onItemClick(AdapterView&lt;?&gt; parent, View view, int position, long id) { Person person = (Person) parent.getItemAtPosition(position); // ... } </code></pre> <p>I consider this to be a slightly more fool-proof approach, as the <code>AdapterView</code> will take into account any header views that may potentially be added using <a href="http://developer.android.com/reference/android/widget/ListView.html#addHeaderView%28android.view.View,%20java.lang.Object,%20boolean%29"><code>ListView.addHeaderView(...)</code></a>. </p> <p>For example, if your <code>ListView</code> contains one header, tapping on the first item supplied by the adapter will result in the <code>position</code> variable having a value of <code>1</code> (rather than <code>0</code>, which is the default case for no headers), since the header occupies position <code>0</code>. Hence, it's very easy to mistakenly retrieve the wrong data for a position and introduce an <code>ArrayIndexOutOfBoundsException</code> for the last list item. By retrieving the item from the <code>AdapterView</code>, the position is automatically correctly offset. You can of course manually correct it too, but why not use the tools provided? :)</p> <p>Just FYI and FWIW.</p>