web-dev-qa-db-ja.com

getView()メソッドはどのように使用され、どこで呼び出されますか?

私はAndroid開発に不慣れで、Android Webサイトで利用可能なチュートリアルに従っています。現在、ビューのチュートリアルのセクション、特にグリッドビューの場合: こんにちは、グリッドビューのチュートリアル

アダプターを介してビューを作成する方法を理解できません。アダプタークラスのgetView()メソッドをオーバーライドする必要があることを理解しています。このメソッドでは、ビューの設定方法を定義します。私が理解していないのは、getView()が実際に呼び出される場所です。おそらく私はここで間違った種類の考え方を持っていますが、以下のコード(グリッドビューチュートリアル)では、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
    };
}
21
amandion

アダプターを設定することで、GridViewにアダプターからビューをフェッチしてすべてのグリッドを埋めるように指示しています。したがって、getViewは、レイアウトを満たすためにGridViewによって内部的に呼び出されます。

そのため、すべてのアダプタがAdapterinterface を実装しているため、どのAdapterViewもアダプタを要求できます。

17
bhups

Adapter.getViewObtainViewメソッド内で呼び出され、GridView親クラスAbsListViewから継承され、ScrapViewオブジェクトが使用可能な場合に渡されます。

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

次に、ObtainViewGridView.onMeasureに直接実装されますが、スクロール、フリング、その他のタッチナビゲーションを処理する継承されたonTouchEventメソッドなど、GridView.layoutChildrenを呼び出すいくつかのコールバックにも実装されます。

5
Trent Steele