Llamada múltiple de getView () en GridView

Mi actividad consiste en GridView que contiene más de 40 elementos. Después de iniciar la actividad, el usuario puede ver un máximo de 15 elementos (3 filas, 5 elementos en cada fila). Escribí en el cuerpo de getView () para pasar al número de LogCat de conseguir Ver:

Log.i("getView()", "GETTING VIEW_POSITION[" + String.valueOf(position) + "]" + (convertView != null?convertView.toString():"null")); 

Después de lanzar mi aplicación, obtengo dicho registro:

 02-09 14:34:56.900: INFO/getView()(388): GETTING VIEW_POSITION[0]null 02-09 14:34:57.300: INFO/getView()(388): GETTING VIEW_POSITION[0]android.widget.FrameLayout@44c7a9c0 02-09 14:34:57.300: INFO/getView()(388): GETTING VIEW_POSITION[1]null 02-09 14:34:57.400: INFO/getView()(388): GETTING VIEW_POSITION[2]null 02-09 14:34:57.510: INFO/getView()(388): GETTING VIEW_POSITION[3]null 02-09 14:34:57.620: INFO/getView()(388): GETTING VIEW_POSITION[4]null 02-09 14:34:57.720: INFO/getView()(388): GETTING VIEW_POSITION[5]null 02-09 14:34:57.840: INFO/getView()(388): GETTING VIEW_POSITION[6]null 02-09 14:34:57.930: INFO/getView()(388): GETTING VIEW_POSITION[7]null 02-09 14:34:58.273: DEBUG/dalvikvm(388): GC freed 3530 objects / 322744 bytes in 270ms 02-09 14:34:58.280: INFO/getView()(388): GETTING VIEW_POSITION[8]null 02-09 14:34:58.300: INFO/getView()(388): GETTING VIEW_POSITION[9]null 02-09 14:34:58.320: INFO/getView()(388): GETTING VIEW_POSITION[10]null 02-09 14:34:58.340: INFO/getView()(388): GETTING VIEW_POSITION[11]null 02-09 14:34:58.360: INFO/getView()(388): GETTING VIEW_POSITION[12]null 02-09 14:34:58.380: INFO/getView()(388): GETTING VIEW_POSITION[13]null 02-09 14:34:58.400: INFO/getView()(388): GETTING VIEW_POSITION[14]null 02-09 14:34:59.220: INFO/getView()(388): GETTING VIEW_POSITION[0]null 02-09 14:34:59.490: INFO/getView()(388): GETTING VIEW_POSITION[0]android.widget.FrameLayout@44c69ef0 

También escribo este post sobre este tipo de problemas. Pero la altura de mi GridView en la descripción XML establecida como fill parent:

 <?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/grid" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="auto_fit" android:horizontalSpacing="10dp" android:verticalSpacing="10dp" android:columnWidth="140dp" android:gravity="center" android:scrollbars="none" /> 

Y finalmente para eliminar todas las dudas, aquí está mi código de adaptador:

 public class ImageAdapter extends BaseAdapter { private Activity activity; private LayoutInflater inflater = null; private ArrayList<Photo> photoes; public ImageAdapter(Activity a, ArrayList<Photo> pictures) { photoes = pictures; activity = a; inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { Log.i("getView()", "GETTING VIEW_POSITION[" + String.valueOf(position) + "]" + (convertView != null?convertView.toString():"null")); View mViewSlice = convertView; if(convertView == null) { mViewSlice = inflater.inflate(R.layout.photo_preview, null); ((TextView) mViewSlice.findViewById(R.id.name_of_photo)).setText(photoes.get(position).getName()); mViewSlice.setPadding(5, 5, 5, 5); mViewSlice.setLayoutParams(new GridView.LayoutParams(-2, -2)); } return mViewSlice; } @Override public int getCount() { return photoes.size(); } @Override public Object getItem(int position) { return photoes.get(position); } @Override public long getItemId(int position) { return position; } } 

Espero que alguien responda a mi problema y me ayude a resolverlo.

Esperando sus sugerencias. Alex.

La respuesta en ese enlace si estoy bastante claro pienso

No hay absolutamente ninguna garantía sobre el número de veces que getView () será invocado para cualquier posición dada

Ahora esta observación también implica que usted no debe usar wrap_content

Normalmente se produce con listas y cuadrículas que tienen una altura establecida en wrap_content

Pero eso no significa que no sucedería en otras situaciones. El error fue cerrado como "WorkingAsIntended", así que no creo que puedas hacer demasiado. Es sólo algo que puede suceder.

Para mí, es incluso peor: la posición 0 se llama a menudo 10 veces. Y se llama incluso si estoy al final de la lista, sin la posición 0 en la pantalla.

Mi solución es una ArrayList estática de los elementos que se están procesando actualmente para la exhibición e ignoro esas llamadas dobles. No es la mejor solución, ya que todavía utiliza los recursos para obtener la posición 0, mientras que incluso no en la pantalla.

Como parece un error, creo que me caché una vista para la posición 0 por lo que obtendría un valor de retorno rápido y adecuado, incluso si la posición no está en la pantalla.

Android 4.2.2.

Tuve el mismo problema, mi solución fue crear una lista fuera del adaptador, a continuación, dar la lista para el adaptador, algo así:

  class MyAdapter extends BaseAdapter{ List<View> views; public MyAdapter(List<View> views){ this.views = views; } ... public View getView(int position, View convertView, ViewGroup parent){ return views.get(position); // now your safe even if element[0] is called n times } } class MyActivity extends Activity{ GridView grid; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); List<View> views = create_your_views(): MyAdapter adapter = new MyAdapter(views); grid.setAdapter(adapter); } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.