2013-08-02 10 views
7

getItemIdAtPosition() è una funzione in Android utilizzata per ottenere l'id di un elemento in un elenco data la sua posizioneAndroid: ottenere la posizione di voce in una lista data la sua ID:

non v'è alcun modo di fare il contrario, vale a dire ottenere la posizione di un oggetto è una vista elenco dato il suo id?

+1

Si avrà una matrice o arraylist che sta facendo da apripista alla tua visualizzazione elenco? Sono abbastanza sicuro che puoi usarlo per raggiungere questo obiettivo. – midhunhk

risposta

10

No. Devi farlo manualmente. Creare un metodo pubblico all'interno dell'adattatore che si sta utilizzando; in quel metodo, loop sugli elementi dell'adattatore e controllare l'id di ciascun elemento. Se è == al parametro param, quindi restituisce l'indice.

public int getItemPosition(long id) 
{ 
    for (int position=0; position<mList.size(); position++) 
     if (mList.get(position).getId() == id) 
      return position; 
    return 0; 
} 

Aggiornamento: Si potrebbe anche salvare una HashMap per la posizione/id l'adattatore, se le prestazioni di ricerca rappresenta un problema per il vostro caso d'uso.

Aggiornamento: Se si desidera utilizzare questo metodo al di fuori della scheda, quindi utilizzare di seguito:

private int getAdapterItemPosition(long id) 
{ 
    for (int position=0; position<mListAdapter.getCount(); position++) 
     if (mListAdapter.get(position).getId() == id) 
      return position; 
    return 0; 
} 
+0

puoi dare il codice per questo? @andrew – user2595281

+0

Devi capire che dipende da cosa contiene l'adattatore ... tuttavia, ecco il codice sopra. –

+0

puoi dirmi come fare la stessa funzione, data la vista elenco e l'id, perchè non so come ottenere quell'array? @andrew – user2595281

0

No. A seconda di cosa adattatore si sta utilizzando per eseguire il vostro ListView l'ID e la posizione può essere lo stesso (non ho guardato tutte le sottoclassi BaseAdapter quindi non posso dirlo con certezza). Se si look at the source code for ArrayAdapter vedrete che getItemId restituisce effettivamente la posizione dell'oggetto nell'adattatore. Se la posizione e l'id sono uguali, non è necessario usarne uno per ottenere l'altro. Altrimenti, devi solo cercare l'adattatore per l'oggetto che stai cercando - usando la posizione o l'id - e puoi trovare l'altro valore.

Se quello che stai parlando è ottenere oggetti usando una chiave univoca, cioè una che tu definisci, che può essere fatta. Quello che devi fare è impostare l'adattatore per prendere uno HashMap anziché uno ArrayList o regolare List di oggetti. Quindi puoi creare il tuo metodo per trovare la chiave semplicemente estraendo quel valore dallo HashMap.

+1

Non del tutto probabile. Ad esempio, CursorAdapters. Per non parlare della maggior parte, se non di tutti, degli adattatori personalizzati. Quindi non contare affatto sull'idea che i valori siano probabilmente uguali. Per quanto riguarda HashMap, sì, è un'alternativa al metodo di ricerca della lista. Dipende dai tuoi bisogni. –

+0

Se si è scritto un adattatore personalizzato, tutte le scommesse sono disattivate. Non ha considerato il CursorAdapter un buon punto di vista. Tuttavia, HashMap è ancora il modo più semplice/veloce per farlo. – Rarw

4

Non so se la domanda è ancora aperta. Tuttavia, ho pensato di condividere come ho fatto in modo che possa aiutare qualcuno che sta cercando di fare la stessa cosa.

È possibile utilizzare la funzione di tag di una vista per memorizzare la mappatura tra l'id di quella vista e la sua posizione nell'elenco.

La documentazione per i tag sul sito degli sviluppatori Android spiega bene:

http://developer.android.com/reference/android/view/View.html#Tags

http://developer.android.com/reference/android/view/View.html#setTag(int, java.lang.Object)

http://developer.android.com/reference/android/view/View.html#getTag(int)

Esempio: Nel metodo GetView della scheda lista, è possibile imposta la mappatura per l'id di quella vista e la sua posizione nell'elenco, ad esempio:

public View getView (int position, View convertView, ViewGroup parent) 
{ 
    if(convertView == null) 
    { 
      // create your view by inflating a xml layout resource or instantiating a 
      // custom view class 
    } 
    else 
    { 
      // Do whatever you want with the convertView object like 
      // finding a child view that you want to set some property of,etc. 
    } 

    // Here you set the position of the view in the list as its tag 
    convertView.setTag(convertView.getId(),position); 

    return convertView; 
} 

per recuperare la posizione della vista, si potrebbe fare qualcosa di simile:

int getItemPosition(View view) 
{ 
    return view.getTag(view.getId()); 
} 

Un punto da notare è che si ha bisogno di avere un riferimento alla Vista la cui posizione si desidera recuperare . Il modo in cui ottieni il riferimento della vista dipende dal tuo caso specifico.

0

che sia troppo tardi per rispondere, ma per il bene ...
per esempio se si dispone di ListView e si desidera ottenere id con click ascoltatore si può ottenere da >>

cListview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 


      @Override 
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
       // for id or any informations 

           itemID = String.valueOf(catList.get(position).getItemID()); 

// for name or any informations 

            itemName = String.valueOf(catList.get(position).getItemName()); 
Problemi correlati