2013-08-02 1 views
7

getItemIdAtPosition() ist eine Funktion in Android verwendet, um die ID eines Elements in einer Listenansicht seiner Position gegeben zu bekommenAndroid: get Position von Elemente in einer Listenansicht angesichts seiner ID:

ist es eine Möglichkeit, das Gegenteil zu tun, dh die Position eines Gegenstandes zu erhalten, ist eine Listenansicht angesichts seiner ID?

+1

Sie eine Array oder Arraylist, die Ihre List View richtig unterstützt? Ich bin mir ziemlich sicher, dass du es benutzen kannst, um das zu erreichen. – midhunhk

Antwort

10

Nein. Sie müssen es manuell tun. Erstellen Sie eine öffentliche Methode in dem von Ihnen verwendeten Adapter. In dieser Methode führen Sie eine Schleife für die Adapterelemente durch und überprüfen Sie jede Element-ID. Wenn es == für den Parameter Methode ist, geben Sie den Index zurück.

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

Update: Genauso gut könnte man eine HashMap für Position/id in Ihrem Adapter speichern, wenn Lookup Leistung ein Problem für Ihren Anwendungsfall darstellt.

Update: Wenn Sie diese Methode außerhalb des Adapter verwenden möchten, dann unten verwenden:

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

können Sie den Code dafür geben? @andrew – user2595281

+0

Sie müssen verstehen, dass es darauf ankommt, was Ihr Adapter enthält ... dennoch, hier ist der Code oben. –

+0

können Sie bitte sagen, wie man die gleiche Funktion, angesichts der Listenansicht und der ID, denn ich weiß nicht, wie man das Array zu bekommen? @andrew – user2595281

0

Nr Je nachdem, welche Adapter Sie verwenden Ihre ListView die ID und die Position sichern kann das gleiche (ich habe nicht alle BaseAdapter Unterklassen angeschaut so kann ich nicht sicher sagen). Wenn Sie look at the source code for ArrayAdapter sehen Sie, dass getItemId tatsächlich die Position des Objekts im Adapter zurückgibt. Wenn die Position und die ID identisch sind, ist es nicht notwendig, eine zu verwenden, um die andere zu erhalten. Andernfalls müssen Sie nur den Adapter nach dem Objekt suchen, nach dem Sie suchen - entweder mit der Position oder der ID - und Sie können den anderen Wert finden.

Wenn es darum geht, Objekte mit einem eindeutigen Schlüssel - d. H. Einen, den Sie definieren - zu erhalten, können Sie das tun. Was Sie tun müssen, ist Ihren Adapter einzurichten, um eine HashMap anstelle einer ArrayList oder regulären List von Objekten zu nehmen. Dann können Sie Ihre eigene Methode erstellen, um nach Schlüssel zu suchen, indem Sie einfach diesen Wert aus dem HashMap ziehen.

+1

Überhaupt nicht wahrscheinlich. Zum Beispiel CursorAdapter. Ganz zu schweigen von den meisten, wenn nicht allen, benutzerdefinierten Adaptern. Verlassen Sie sich also nicht auf die Idee, dass die Werte wahrscheinlich gleich sind. Wie für die HashMap, ja, es ist eine Alternative zu der List-Lookup-Methode. Es hängt von Ihren Bedürfnissen ab. –

+0

Gut, wenn Sie einen benutzerdefinierten Adapter geschrieben haben, sind alle Wetten aus. Habe den CursorAdapter nicht als guten guten Punkt angesehen. HashMap ist immer noch der einfachste/schnellste Weg, dies zu tun. – Rarw

4

Nicht sicher, ob die Frage noch offen ist. Trotzdem denke ich, ich werde teilen, wie ich es gemacht habe, damit es jemandem helfen kann, der dasselbe machen möchte.

Sie können die Tag-Funktion einer Ansicht verwenden, um die Zuordnung zwischen der ID dieser Ansicht und ihrer Position in der Liste zu speichern.

Die Dokumentation für Tags auf der Website für Android-Entwickler erklärt es gut:

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)

Beispiel: Im getView Methode Ihrer Liste Adapter können Sie Legen Sie die Zuordnung für die ID dieser Ansicht und ihre Position in der Liste fest:

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; 
} 

die Position der Ansicht abzurufen, Sie so etwas wie tun würde:

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

Ein Punkt ist zu beachten, dass Sie einen Verweis auf die Aussicht haben brauchen, dessen Position Sie abrufen möchten . Wie Sie die Referenz der View erhalten, hängt von Ihrem speziellen Fall ab.

0

es ist zu spät zu beantworten, aber für Nutzen ...
zum Beispiel, wenn Sie Listenansicht haben, und Sie wollen id mit Klick Hörer erhalten können Sie es bekommen >>

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()); 
Verwandte Themen