2011-02-09 12 views
12

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 getView() del cuerpo para pasar al número LogCat de conseguir Ver:Llamadas múltiples de getView() en GridView

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

Después de lanzar mi aplicación consigo tal 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][email protected] 
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][email protected] 

también roja this post acerca de este tipo de problema . Pero la altura de mi GridView en la descripción XML establece como relleno de los padres:

<?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 va a responder a mi problema y le ayudará yo para resolverlo

Esperando por sugerencias. Alex.

+1

¿Cuál es tu pregunta? –

Respuesta

10

La respuesta en ese enlace si bastante claro creo

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

Ahora bien, este observación también implica que no debe usar wrap_content

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

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

+1

Romain dijo para cualquier posición dada. Pero estoy seguro de que no soy el primer hombre que encontró que este problema solo se aplica a la primera posición en GridView. Y repito nuevamente, como puede ver en mi XML, no uso wrap_content. – teoREtik

+0

Lo que quiero decir es que aunque hay una mención de wrap_content, no hay mención de algo así ** ** que ocurre con fill_parent. Entonces no hay necesidad de repetir lo que dijiste, te conseguí la primera vez. Simplemente no estoy de acuerdo en que importe: D. Ahora por qué es solo la primera posición que no sé, pero la primera posición es parte de "cualquier posición dada". Entonces, mientras leo la respuesta, su comportamiento inmóvil es el esperado. – Nanne

+0

¿Podría explicar, qué quiere decir cuando dice, que la primera posición es la parte de cualquier posición dada? – teoREtik

-6

que tenía el mismo problema, mi solución era 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);   
    } 
} 
+1

Esta es la forma habitual de configurar los datos en el adaptador y no tiene ninguna relación con el problema descrito. – Ixx

6

Para mí, es aún peor: 0 posición es llamado 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 elementos que se procesan actualmente para su visualización e ignoro esas llamadas dobles. Sin embargo, no es la mejor solución, ya que aún utiliza recursos para obtener la posición 0 mientras ni siquiera está en la pantalla.

Como parece un error, creo que almacenaré en caché una Vista para la posición 0, de modo 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.

+0

Entonces tienes suerte, en mi caso se llama 33 veces para el puesto 0. Implementaré el caché para ver 0, como dijiste. – Corbella

Cuestiones relacionadas