2010-09-01 21 views
21

Soy nuevo en el desarrollo de Android y he estado siguiendo los tutoriales disponibles en el sitio web de Android. Actualmente estoy en la sección de tutoriales para vistas, específicamente la de vistas de cuadrícula: Hello, Grid View Tutorial.¿Cómo se usa el método getView() y dónde se llama?

Tengo problemas para entender cómo se realizan las vistas a través de un adaptador. Entiendo que debe anular el método getView() en su clase de adaptador y en este método es donde define cómo se configuran sus Vistas. Lo que no entiendo es dónde se llama realmente getView()? Tal vez tengo el tipo de mentalidad equivocado aquí, pero en el código a continuación (el tutorial de Grid View) no veo ninguna llamada a getView() (o cualquier otra cosa utilizada en la clase de adaptador, como 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 
    }; 
} 

Respuesta

17

Al establecer adaptador, le está diciendo GridView a buscar puntos de vista desde el adaptador para llenar todas las cuadrículas Por lo tanto, GridView llama internamente al getView para completar el diseño.

Por eso todos los adaptadores implementan Adapterinterface para que cualquier AdapterView pueda solicitar el adaptador.

5

Adapter.getView se llama el interior ObtainView método, heredado de GridView clase padre AbsListView, con ScrapView objetos pasados ​​en cuando esté disponible:

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

Entonces ObtainView se implementa en GridView.onMeasure directamente, sino también en varios más devoluciones de llamada que invocan GridView.layoutChildren, incluyendo el método onTouchEvent heredado que maneja desplazamiento, fling y otra navegación táctil.

Cuestiones relacionadas