2010-09-01 7 views
21

Je suis nouveau sur le développement Android et j'ai suivi les tutoriels disponibles sur le site Android. Je suis actuellement sur la section des tutoriels pour les vues, en particulier celui pour les vues de la grille: Hello, Grid View Tutorial.Comment la méthode getView() est-elle utilisée et où est-elle appelée?

Je n'arrive pas à comprendre comment les vues sont prises via un adaptateur. Je comprends que vous devez remplacer la méthode getView() dans votre classe d'adaptateur et dans cette méthode est où vous définissez comment vos vues sont configurées. Ce que je ne comprends pas, c'est où getView() est-il réellement appelé? Peut-être que j'ai le mauvais type de mentalité ici, mais dans le code ci-dessous (le tutoriel Grid View) je ne vois aucun appel à getView() (ou à tout autre chose utilisé dans la classe adaptateur comme 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 
    }; 
} 

Répondre

17

En réglant l'adaptateur, vous dites GridView chercher des vues de l'adaptateur pour remplir toutes les grilles Donc, getView est appelé en interne par GridView pour remplir la mise en page.

C'est pourquoi toutes les cartes implémente Adapterinterface afin que n'importe quel adaptateur puisse demander l'adaptateur.

5

Adapter.getView est appelé à l'intérieur de la méthode ObtainView, héritée de GridView classe parente AbsListView, avec ScrapView objets passés lorsque disponibles:

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

Ensuite ObtainView est implémenté dans GridView.onMeasure directement, mais aussi dans plusieurs autres callbacks qui font appel à GridView.layoutChildren, y compris la méthode héritée onTouchEvent qui gère le défilement, le lancer et la navigation tactile.

Questions connexes