如何使用getView()方法以及它在哪里被调用?

问题描述:

我是Android开发新手,一直关注Android网站上提供的教程。我目前在视图教程部分,特别是网格视图教程:Hello, Grid View Tutorial如何使用getView()方法以及它在哪里被调用?

我无法理解如何通过适配器进行视图。我知道你必须重写适配器类中的getView()方法,并且在这个方法中你可以定义视图的设置方式。我不明白的是getView()实际上被调用的地方?也许我在这里有错误的心态,但在下面的代码中(Grid View教程),我没有看到任何对getView()(或适配器类中使用的任何其他事物(如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 
    }; 
} 

通过设置适配器,你告诉GridView控件从适配器读取的意见,以填补所有的网格。所以GridView内部调用getView来填充布局。

这就是为什么所有适配器实现Adapterinterface,以便任何AdapterView可以请求适配器。

Adapter.getView被称为内ObtainView方法,从GridViewAbsListView类继承,与ScrapView可当对象通过:

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

然后ObtainViewGridView.onMeasure实现直接而且在几个回调来调用GridView.layoutChildren,包括处理滚动,一掷和其他触摸导航的继承方法onTouchEvent