2010-09-01 38 views
21

Tôi mới phát triển Android và đã theo các hướng dẫn có sẵn trên trang web Android. Tôi hiện đang ở phần hướng dẫn cho Chế độ xem, cụ thể là phần dành cho Chế độ xem lưới: Hello, Grid View Tutorial.Phương thức getView() được sử dụng như thế nào và nó được gọi ở đâu?

Tôi gặp sự cố khi hiểu cách chế độ xem được thực hiện thông qua bộ điều hợp. Tôi hiểu rằng bạn phải ghi đè lên phương thức getView() trong lớp bộ điều hợp của bạn và trong phương thức này là nơi bạn xác định cách thiết lập Views của bạn. Những gì tôi không hiểu là getView() thực sự được gọi ở đâu? Có lẽ tôi đã có loại tâm lý sai ở đây, nhưng trong đoạn code dưới đây (hướng dẫn Grid View), tôi không thấy bất kỳ lời gọi nào đến getView() (hoặc bất kỳ thứ gì khác được sử dụng trong lớp bộ điều hợp như 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 
    }; 
} 

Trả lời

17

Bằng cách đặt Adapter, bạn đang nói với GridView để lấy điểm từ Adaptor để điền lên tất cả các lưới. Vì vậy, getView được gọi nội bộ bởi GridView để điền vào bố cục.

Đó là lý do tại sao tất cả các bộ điều hợp thực hiện Adapterinterface để bất kỳ AdapterView nào cũng có thể yêu cầu Bộ điều hợp.

5

Adapter.getView được gọi là bên ObtainView phương pháp, kế thừa từ GridView tầng lớp phụ huynh AbsListView, với ScrapView các đối tượng thông qua trong khi có sẵn:

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

Sau đó ObtainView được thực hiện trong GridView.onMeasure trực tiếp mà còn ở một số callbacks hơn gọi GridView.layoutChildren, bao gồm phương pháp được thừa kế onTouchEvent xử lý cuộn, di chuyển và điều hướng cảm ứng khác.

Các vấn đề liên quan