risposta

103

1: Lo LayoutInflater prende i file XML del layout e crea diversi oggetti View dal suo contenuto.

2: Gli adattatori sono creati per riutilizzare le viste, quando una vista scorre in modo da non essere più visibile, può essere utilizzata per visualizzare una delle nuove viste. Questa vista riutilizzata è la convertView. Se questo è nullo significa che non esiste una vista riciclata e dobbiamo crearne una nuova, altrimenti dovremmo usarla per evitare di crearne una nuova.

3: Il parent viene fornito in modo da poter gonfiare la vista in quello per i parametri di layout corretta.

Tutti questi insieme possono essere utilizzati per creare in modo efficace la visione che apparirà nella vostra lista (o altra vista che prende un adattatore):

public View getView (int position, View convertView, ViewGroup parent){ 
    if(convertView == null){ 
     //We must create a View: 
     convertView = inflater.inflate(R.layout.my_list_item, parent, false); 
    } 
    //Here we can do changes to the convertView, such as set a text on a TextView 
    //or an image on an ImageView. 
    return convertView; 
} 

Avviso l'uso della LayoutInflater, che parent può essere utilizzato come argomento per questo e come viene riutilizzato convertView. Metodo

+4

Convertview == null è utile quando tutte le tue iten seguono lo stesso layout. Ad esempio, se è necessario verificare la presenza di una radio o di un pulsante con il segno di spunta e modificare il layout in base a ciascun elemento, è necessario reinfilare o visualizzare la cache. – sagits

+0

Non è necessario reinfilare. È sufficiente scrivere switch o if-else ladder in getview e gonfiare le visualizzazioni in base al caso, sovrascrivere public int getItemViewType (int position) e public int getViewTypeCount(). @sagits –

+0

Se le istruzioni di solito funzionano, ma quando si utilizzano i pulsanti di opzione, i testi di modifica e questi tipi di elementi che ho avuto problemi con l'utilizzo di visualizzazioni memorizzate nella cache, ci sono alcune domande relative a questo materiale nello stack overflow. – sagits

9

Si potrebbe dare un'occhiata a questo video sulla visualizzazione elenco. Si tratta degli ultimi anni di Google IO e rappresenta ancora la migliore panoramica sulle visualizzazioni di elenchi nella mia mente.

http://www.youtube.com/watch?v=wDBM6wVEO70

  1. Si gonfia layout (i file XML sul vostro res/layout/cartella) in oggetti Java come ad esempio LinearLayout e altri punti di vista.

  2. Guarda il video, ti aggiornerà con l'uso della vista convert, fondamentalmente una vista riciclata in attesa di essere riutilizzata da te, per evitare di creare un nuovo oggetto e rallentare lo scorrimento del tuo elenco.

  3. Consente di fare riferimento alla vista elenco dall'adattatore.

4
  1. layout di gonfiaggio gonfia/aggiunge XML esterno alla visualizzazione corrente.

  2. getView() viene chiamato numerose volte incluso lo scorrimento. Quindi, se ha già una visualizzazione gonfiata, non vogliamo farlo di nuovo poiché il gonfiaggio è un processo costoso. Ecco perché controlliamo se è nullo e quindi lo gonfiamo.

  3. La vista padre è singola cella della tua lista ..

+3

La visualizzazione padre è spiegata in modo errato qui. Sarà il ListView non il ListItem –

2

LayoutInflater viene utilizzato per generare viste dinamiche del XML per la voce ListView o in onCreateView del frammento.

ConvertView è fondamentalmente utilizzato per riciclare le viste che non sono attualmente nella vista. Supponi di avere un riquadro scorrevole ListView. Scorrendo verso il basso o verso l'alto, il convertView dà la vista che è stata fatta scorrere. Questo riutilizzo salva la memoria.

Il parametro padre del metodo getView() fornisce un riferimento al layout principale che ha il listView. Dire che si desidera ottenere l'ID di qualsiasi elemento nel XML principale è possibile utilizzare:

ViewParent nv = parent.getParent(); 

while (nv != null) { 

    if (View.class.isInstance(nv)) { 
     final View button = ((View) nv).findViewById(R.id.remove); 
     if (button != null) { 
      // FOUND IT! 
      // do something, then break; 
      button.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        Log.d("Remove", "Remove clicked"); 

        ((Button) button).setText("Hi"); 
       } 
      }); 
     } 
     break; 
    } 

} 
1

getView() metodo creare nuove View o ViewGroup per ogni riga di Listview o Spinner. È possibile definire questo View o ViewGroup in un file Layout XML nella cartella res/layout e può fornire il riferimento all'oggetto classe Adapter.

se si dispone di 4 elementi in una matrice passati ad Adattatore.Il metodo getView() creerà 4 Visualizza per 4 righe di Adaper.

LayoutInflater class ha un metodo gonfiare() che crea l'oggetto Visualizza dal layout della risorsa XML.

61

getView() in adattatore è per la generazione di vista del capo di un ListView, Gallery, ...

  1. LayoutInflater viene utilizzato per ottenere l'oggetto View, che si definisce in un layout di XML (l'oggetto principale , normalmente un LinearLayout, FrameLayout o RelativeLayout)

  2. convertView è per il riciclaggio. Supponiamo che tu abbia una listview che può visualizzare solo 10 elementi alla volta e che al momento è visualizzare l'elemento 1 -> elemento 10. Quando scorri verso il basso di un elemento, l'elemento sarà fuori dallo schermo e l'elemento 11 verrà visualizzato essere visualizzato. A generare Visualizza per l'articolo 11, verrà chiamato il metodo getView() e convertView qui è la vista dell'elemento 1 (che non è più necessario ). Quindi, invece, crea un nuovo oggetto View per l'elemento 11 (che è costoso ), perché non riutilizzare convertView? => controlliamo semplicemente convertView è null o no, se nullo crea una nuova vista, altrimenti riusciamo a convertView.

  3. parentView è la vista che conteneva vista dell'elemento che genera getView(). Normalmente è ListView o una galleria ...

Nota: non si chiama questo metodo direttamente, solo bisogno di attuarla a dire la vista padre come generare punto di vista della voce.

+2

spiegazione ECCELLENTE per il parentView, non riesco a trovare una spiegazione migliore di questa, +1 –

+0

spiegazione stupefacente! – gabi

+0

grande spiegazione +1 – tpk

5

Qual è esattamente la funzione di LayoutInflater?

Quando si progetta utilizzando XML, tutti gli elementi dell'interfaccia utente sono solo tag e parametri.Prima di poter utilizzare questi elementi dell'interfaccia utente, ad esempio TextView o LinearLayout, è necessario creare gli oggetti effettivi corrispondenti a questi elementi xml. Ecco a cosa serve l'inflater. Il inflater, usa questi tag e i loro parametri corrispondenti per creare gli oggetti reali e impostare tutti i parametri. Dopo questo è possibile ottenere un riferimento all'elemento dell'interfaccia utente utilizzando findViewById().

Perché tutti gli articoli che ho letto controllano se convertview è nullo o non prima? Cosa significa quando è nullo e cosa significa quando non lo è?

Questo è interessante. Vedete, getView() viene chiamato ogni volta che viene estratto un elemento nell'elenco. Ora, prima che l'oggetto possa essere disegnato, deve essere creato. Ora convertView fondamentalmente è l'ultima vista usata per disegnare un oggetto. In getView() si gonfia prima l'xml e poi si usa findByViewID() per ottenere i vari elementi dell'interfaccia utente del listitem. Quando controlliamo (convertView == null), ciò che facciamo è controllare che se una vista è nullo (per il primo elemento), quindi crearla, altrimenti, se esiste già, riutilizzarla, non c'è bisogno di ripetere il processo di rigonfiamento . Lo rende molto più efficiente.

Devi anche avere trovato un concetto di ViewHolder in getView(). Questo rende la lista più efficiente. Quello che facciamo è creare un viewholder e memorizzare il riferimento a tutti gli elementi dell'interfaccia utente che abbiamo ottenuto dopo il gonfiaggio. In questo modo, possiamo evitare di chiamare numerosi findByViewId() e risparmiare molto tempo. Questo ViewHolder viene creato nella condizione (convertView == null) e viene memorizzato in convertView utilizzando setTag(). Nel ciclo else lo otteniamo di nuovo usando getView() e riutilizzalo.

Qual è il parametro padre che questo metodo accetta?

Il genitore è un ViewGroup a cui viene infine allegata la vista creata da getView(). Ora nel tuo caso questo sarebbe il ListView.

Spero che questo aiuti :)

0

È possibile anche trovare informazioni utili GetView a livello di interfaccia dell'adattatore nel file di Adapter.java. Dice;

/** 
* Get a View that displays the data at the specified position in the data set. You can either 
* create a View manually or inflate it from an XML layout file. When the View is inflated, the 
* parent View (GridView, ListView...) will apply default layout parameters unless you use 
* {@link android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)} 
* to specify a root view and to prevent attachment to the root. 
* 
* @param position The position of the item within the adapter's data set of the item whose view 
*  we want. 
* @param convertView The old view to reuse, if possible. Note: You should check that this view 
*  is non-null and of an appropriate type before using. If it is not possible to convert 
*  this view to display the correct data, this method can create a new view. 
*  Heterogeneous lists can specify their number of view types, so that this View is 
*  always of the right type (see {@link #getViewTypeCount()} and 
*  {@link #getItemViewType(int)}). 
* @param parent The parent that this view will eventually be attached to 
* @return A View corresponding to the data at the specified position. 
*/ 
View getView(int position, View convertView, ViewGroup parent); 
Problemi correlati