2013-04-08 3 views
5

Gibt es eine Möglichkeit, die Ressourcen-ID (wie R.layout.viewtoInflate) des Layouts, aus dem eine Ansicht wurde aufgeblasen erhalten?Erhalten Ressource-ID von welcher Ansicht wurde aufgeblasen

Ich versuche, eine Listenansicht zu implementieren, die 2 benutzerdefinierte Layouts für die Listenelemente verwendet. Welches Elementlayout verwendet wird, basiert auf einem Feld in den Objekten, die zum Füllen der Listenansicht verwendet werden.

Was ich in meinem benutzerdefinierten Adapter vermisse, ist eine Möglichkeit, zu wissen, welche Ressource die 'convertView', die ich in getView() bekommen habe, von aufgeblasen wurde. Wenn ich diese Informationen erhalten könnte, kann ich vergleichen und feststellen, ob ich die konvertierte Ansicht wiederverwenden kann, wie sie ist, oder ob ich sie durch das entsprechende Layout für den aktuellen Artikel ersetzen muss.

So ideal wäre es so etwas wie dieses:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 

    JSONObject currItem = mItems.getJSONObject(position); 

    int layoutType; 

    if (currItem.getBoolean("alternate")) 
     layoutType = R.layout.list_item_b; 
    else 
     layoutType = R.layout.list_item_a; 

    if (convertView == null || <convertView.resourceID> != layoutType) { 
     convertView = inflater.inflate(layoutType, null); 

     //Finish setting up new View and its holder 
    } 
    else { 
     //Get view holder for view reuse 
    } 

    //populate view with the required content 

    return convertView; 
} 

Im schlimmsten Fall konnte ich einfach nicht alle wiederverwenden Ansichten und aufblasen nur das Layout ich jedes Mal brauchen, aber es scheint sehr verschwenderisch.

Antwort

5

Es gibt eine offizielle Möglichkeit, mehrere Layouts zu verwenden, überschreiben Sie einfach getViewTypeCount() und getItemViewType(). Diese Methoden informieren den Adapter, mehrere Layouts zu erwarten, und convertView wird immer das richtige Layout sein (also muss die Ressourcen-ID nicht überprüft werden.) Für einen Beispielcode siehe this example.

Aber wenn Sie herausfinden möchten, welches Layout welches ist, suchen Sie einfach nach einem einzigartigen Merkmal. Sie können beispielsweise findViewById() für eine View verwenden, die nur in einem Layout vorhanden ist, und dann prüfen, ob sie null zurückgibt oder nicht.

+0

Ich verstehe nicht, wie ich diese Multi-Layout-Funktionalität verpasst habe, aber danke. Danke auch für den Vorschlag, den Layout-Typ zu finden, der jetzt nicht mehr benötigt wird, aber trotzdem gut zu wissen ist. Dennoch erscheint es mir seltsam, dass es keinen offiziellen Weg gibt, das Layout einer aufgeblasenen Ansicht zu erhalten. – RobertoCuba

3

Listenansicht unterstützt mehrere Layouts - Sie müssen die Anzahl der Layouts, die in getViewTypeCount() verwendet werden, zurückgeben und den Layout-Typ für die Zeile in getItemViewType() korrigieren.

Und wenn Sie immer noch wissen möchten, welches Layout es aufgeblasen wurde, können Sie beliebige Informationen an die Ansicht mit setTag() anhängen und später mit getTag() abrufen - es kann Ihre layoutId oder irgendetwas anderes sein.

-1

Wenn Sie nach IDs von Elementen aus dem Layout fragen, die Sie aufgeblasen haben. Es geht so: -

//Suppose you have an TextView in the inflated layout of id textView1. Here you go 

convertView = inflater.inflate(layoutType, null); 
TextView tv = (TextView)convertview.findViewById(R.id.textView1); 
+0

Wie gibt der obige Code die ID des aufgeblähten Artikels zurück? findviewbyid gibt nur die Ansicht und nicht die ID zurück –

1

Was ich tue, ist die Ressourcen-ID der aufgeblasenen Ansicht in der Ansicht Halter spart beim Erstellen der Ansicht. Dadurch kann ich die Layout-Ressourcen-ID abrufen, wenn ich die Ansichten bevölke.

Hoffe, das hilft.

Verwandte Themen