Как используется метод getView() и где он вызван?
Я новичок в разработке Android и слежу за учебниками, доступными на веб-сайте Android. В настоящее время я нахожусь в разделе уроков для Views, в частности, для Grid Views: Привет, Grid View Tutorial.
У меня возникли проблемы с пониманием того, как представления выполняются через адаптер. Я понимаю, что вы должны переопределить метод 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 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
};
}
Ответы
Ответ 1
Установив адаптер, вы сообщаете GridView, чтобы получать из Адаптера представления, чтобы заполнить все решетки. Поэтому getView
внутренне вызывается GridView для заполнения макета.
Вот почему все адаптеры реализуют Adapter
интерфейс, чтобы любой AdapterView мог запросить адаптер.
Ответ 2
Adapter.getView
вызывается внутри метода ObtainView
, унаследованного от GridView
родительского класса AbsListView
, при этом объекты ScrapView передаются, когда они доступны:
child = mAdapter.getView(position, scrapView, this);
Затем ObtainView
реализуется непосредственно в GridView.onMeasure
, но также в нескольких других обратных вызовах, вызывающих GridView.layoutChildren
, включая унаследованный метод onTouchEvent
, который обрабатывает прокрутку, прокрутку и другую навигацию по касанию.