android - studio - ¿Cómo se usa el método getView() y dónde se llama?
sgoliver listview (2)
Soy nuevo en el desarrollo de Android y he seguido los tutoriales disponibles en el sitio web de Android. Actualmente estoy en la sección de tutoriales para vistas, específicamente la de Grid Views: Hello, Grid View Tutorial .
Tengo problemas para entender cómo se realizan las vistas a través de un adaptador. Entiendo que debe anular el método getView () en su clase de adaptador y en este método es donde define cómo se configuran sus Vistas. Lo que no entiendo es ¿de dónde se llama en realidad a getView ()? Quizás tengo un tipo de mentalidad equivocada aquí, pero en el código a continuación (el tutorial de Grid View) no veo ninguna llamada a getView () (o cualquier otra cosa utilizada en la clase de adaptador como 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
};
}
Al configurar el Adaptador, le está diciendo a GridView que obtenga vistas del Adaptador para llenar todas las cuadrículas. Por getView
tanto, a getView
se le llama internamente a getView
para completar el diseño.
Es por eso que todos los adaptadores implementan la interface Adapter
para que cualquier AdapterView pueda solicitar el Adaptador.
Adapter.getView
se llama dentro del método ObtainView
, heredado de la clase primaria GridView
AbsListView
, con objetos ScrapView pasados cuando están disponibles:
child = mAdapter.getView(position, scrapView, this);
Luego, se implementa ObtainView
en GridView.onMeasure
directamente, pero también en varias devoluciones de llamadas que invocan GridView.layoutChildren
, incluido el método heredado onTouchEvent
que maneja el desplazamiento, el fling y otros onTouchEvent
táctiles.