2012-10-19 14 views
22

Jestem zdezorientowany różnicą między postion i row id w ListActivity.onListItemClick().Praktyczna różnica między położeniem a identyfikatorem wiersza w onListItemClick()

Dokumentacja zawiera następujące elementy:

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

Czy istnieje praktyczna różnica między tymi dwoma? Zakładam, że ponieważ istnieją dwa różne parametry, że istnieją sytuacje, w których wartości są różne, ale na podstawie sformułowania użytego w dokumentacji, trudno jest zobaczyć, jaka to różnica. Czy jeden z nich może przechowywać wartość identyfikatora wiersza bazy danych podanego przez Cursor lub inną specjalną funkcję?

+2

Załóżmy, klasyfikowane listę. Wtedy pozycja będzie zupełnie inna niż id. Pozycja jest od góry do dołu, a id jest unikalnym identyfikatorem. –

+0

W jaki sposób jest przypisany unikalny identyfikator? Czy kolejność pozycji w ListView jest zapełniana, zanim zostanie wykonana jakakolwiek operacja taka jak sortowanie? –

Odpowiedz

30

pozycja: Stanowisko widoku na liście
id: id rząd elementu, który został kliknięty

Stanowisko zaczyna się od 0, od góry do dołu z ListView, natomiast aby uzyskać prawidłowy identyfikator wiersza, ważne jest, aby kursor przekazany do adaptera zawierał kolumnę o nazwie "_id" reprezentującą unikalny identyfikator dla każdego wiersza w tabeli.

Jeśli używasz ArrayAdapter, position i id stają się takie same. Identyfikator będzie zwracaną wartością Adapter.getItemId(int), więc jeśli użyjesz ArrayAdapter będzie to samo, co pozycja - szybkie wyszukanie kodu źródłowego ArrayAdapter pokazuje, że używa on pozycji powrotnej; wypracować identyfikator.

+0

Jeśli tabela nie zawiera pola '_id', czy można bezpiecznie powiedzieć, że pozycja i identyfikator wiersza będą takie same? –

+4

Wygląda na to, że jeśli używasz arrayAdapter, jest taki sam. Identyfikator będzie zwracaną wartością Adapter.getItemId (int), więc jeśli użyjesz ArrayAdapter, będzie on taki sam jak pozycja - szybkie wyszukanie kodu źródłowego ArrayAdapter pokazuje, że używa on pozycji powrotnej; opracować identyfikator :) –

+3

To pomija przypadek posiadania 'ListView' z widokiem nagłówka. W takim przypadku position = id + 1. [Zobacz moją odpowiedź] (http://stackoverflow.com/a/24531354/383414) –

24

Najczęściej poprawna jest wersja answer by Lazy Ninja, jednak pomija ona przypadek użycia ArrayAdapter z widokiem nagłówka dodanym przez wywołanie metody ListView.addHeaderView(View).

Jeśli lista ma pozycję nagłówka, to będzie w pozycji 0.

więc pierwszy "prawdziwy" pozycja na liście będzie miał:

  • position = 1
  • id = 0

ogólnie position = id + number_of_header_views


Jest to ważne, aby uświadomić sobie, jeśli zdecydujesz się dodać widok nagłówka do listy w kodzie, który już działa poprawnie.

Jeśli łączysz się z elementów za pomocą position, wówczas kod musi zostać zaktualizowane zgodnie z poniższymi wytycznymi:

  • użytku position - 1 jako indeksu
  • użytku id jako indeks
  • użytku ListView.getItemAtPosition(int) zamiast z Adapter.getItem(int)

Zobacz także to pytanie do pokrewnej dyskusji:

+2

Różnica wysłana przez ciebie jest bardzo ważnym punktem w zrozumieniu listview z nagłówkiem .. Dziękuję dużo za dodatkową odpowiedź tutaj .. – Kushal

Powiązane problemy