2010-09-01 20 views
21

Sono nuovo nello sviluppo di Android e ho seguito le esercitazioni disponibili sul sito web di Android. Sono attualmente nella sezione di tutorial per Views, in particolare quella per le visualizzazioni Grid: Hello, Grid View Tutorial.Come si usa il metodo getView() e dove viene chiamato?

Non riesco a capire come vengono fatte le viste tramite un adattatore. Comprendo che è necessario sovrascrivere il metodo getView() nella classe dell'adattatore e in questo metodo è possibile definire la modalità di impostazione delle visualizzazioni. Quello che non capisco è dove viene effettivamente chiamato getView()? Forse ho il tipo di mentalità sbagliata qui, ma nel codice qui sotto (il tutorial Grid View) non vedo alcuna chiamata a getView() (o qualsiasi altra cosa usata nella classe dell'adattatore come getCount()) .

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:columnWidth="90dp" 
    android:numColumns="auto_fit" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="10dp" 
    android:stretchMode="columnWidth" 
    android:gravity="center" /> 

Start.java

package com.examples.hellogridlayout; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.GridView; 
import android.widget.Toast; 
import android.widget.AdapterView.OnItemClickListener; 

public class Start extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    GridView gridview = (GridView)findViewById(R.id.gridview); 
    gridview.setAdapter(new ImageAdapter(this)); 

    gridview.setOnItemClickListener(new OnItemClickListener(){ 
     public void onItemClick(AdapterView<?> parent,View v, int position, long  id){ 
      Toast.makeText(Start.this, "" + position,Toast.LENGTH_SHORT).show(); 
     } 

     }); 
    } 
} 

ImageAdapter.java

package com.examples.hellogridlayout; 

import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 

public class ImageAdapter extends BaseAdapter { 
    private Context mContext; 

    public ImageAdapter(Context c) { 
     mContext = c; 
    } 

    public int getCount() { 
    return mThumbIds.length; 
    } 

    public Object getItem(int position) { 
    return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    // create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView; 
     if (convertView == null) { // if it's not recycled, initialize some attributes 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(8, 8, 8, 8); 
     } else { 
      imageView = (ImageView) convertView; 
     } 

     imageView.setImageResource(mThumbIds[position]); 
     return imageView; 
    } 

    // references to our images 
    private Integer[] mThumbIds = { 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7, 
      R.drawable.sample_0, R.drawable.sample_1, 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7, 
      R.drawable.sample_0, R.drawable.sample_1, 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7 
    }; 
} 

risposta

17

Impostando adattatore, si indica GridView per andare a prendere una vista dal adattatore per riempire su tutte le griglie. Quindi getView viene chiamato internamente da GridView per riempire il layout.

Ecco perché tutti gli adattatori implementano Adapterinterface in modo che qualsiasi AdapterView può richiedere l'adattatore.

5

Adapter.getView è chiamato all'interno ObtainView metodo, ereditato da GridView classe genitore AbsListView, con ScrapView oggetti passati quando disponibili:

child = mAdapter.getView(position, scrapView, this); 

Poi ObtainView è implementato in GridView.onMeasure direttamente, ma anche in molte altre callback che invocano GridView.layoutChildren, incluso il metodo ereditato onTouchEvent che gestisce scroll, fling e altri touch di navigazione.

Problemi correlati