私は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
};
}
アダプターを設定することで、GridViewにアダプターからビューをフェッチしてすべてのグリッドを埋めるように指示しています。したがって、getView
は、レイアウトを満たすためにGridViewによって内部的に呼び出されます。
そのため、すべてのアダプタがAdapter
interface を実装しているため、どのAdapterViewもアダプタを要求できます。
Adapter.getView
はObtainView
メソッド内で呼び出され、GridView
親クラスAbsListView
から継承され、ScrapViewオブジェクトが使用可能な場合に渡されます。
child = mAdapter.getView(position, scrapView, this);
次に、ObtainView
がGridView.onMeasure
に直接実装されますが、スクロール、フリング、その他のタッチナビゲーションを処理する継承されたonTouchEvent
メソッドなど、GridView.layoutChildren
を呼び出すいくつかのコールバックにも実装されます。