2011-12-28 10 views
16

Ahora mismo para poblar mis GridViews estoy utilizando una clase BaseAdapter extendida en cada una de mis actividades de Android (que son la mayoría de ellas).Android: BaseAdapter y getLayoutInflater en un archivo de clase separado

Para facilitar la lectura y el mantenimiento, intento poner todo el código BaseAdapter en un archivo de clase separado.

para poblar el GridView, estoy usando LayoutInflater, y aquí es donde las cosas se complica ...

Desde el getLayoutInflater() proviene de android.Activity, simplemente no va a hacer el truco. Intenté hacer que mi Adapter.java (la clase para poblar las GridViews) una clase de actividad extendida, y luego crear la clase BaseAdapter (la forma en que lo hago ahora mismo), pero no he podido hacer que funcione correctamente.

Así es como se ve Adapter.java:

//Adapter.java 
package com.cimp.matitec; 

import greendroid.app.GDActivity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class Adapter extends GDActivity{ 

public class ImageAdapter extends BaseAdapter 
{ 
    Context MyContext; 
    int count; 
    String[] nombre; 

    public ImageAdapter(Context _MyContext, int n, String[] nombre) 
    { 
     MyContext = _MyContext; 
     count = n; 
     this.nombre = nombre; 
    } 

    public int getCount() 
    { 
        /* Set the number of element we want on the grid */ 
     return count; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View MyView = convertView; 

     if (convertView == null) 
     { 
     /*we define the view that will display on the grid*/ 

     //Inflate the layout 
     LayoutInflater li = getLayoutInflater(); 
     MyView = li.inflate(R.layout.grid_item, null); 

     // Add The Text!!! 
     TextView tv = (TextView)MyView.findViewById(R.id.grid_item_text); 
     tv.setText(nombre[position]+""); 

     // Add The Image!!!   
     ImageView iv = (ImageView)MyView.findViewById(R.id.grid_item_image); 
     iv.setImageResource(R.drawable.ic_launcher); 
     } 

     return MyView; 
    } 

    @Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
} 
} 

Para llamar desde el exterior, hago lo siguiente:

//MainClass.java 
Adapter MyGridAdapter = new Adapter(); 
MyGrid = (GridView)findViewById(R.id.grid); 
MyGrid.setAdapter(MyGridAdapter.new ImageAdapter(this, 6, nombreTema)); 

Las carreras de aplicaciones, pero cuando se trata de llenar, tengo una NullPointerException getLayoutInflater().

¿Alguien sabe lo que me falta, o cómo hacer que funcione correctamente?

+0

¿GDActivity extiende 'Activity'? – Squonk

+0

Sí, es una actividad Greendroid –

+0

Desde la perspectiva OO, el adaptador no es una actividad, su código simplemente no es razonable. Busca la simplicidad, pero termina con el tiempo y la complejidad, la forma en que Google recomienda podría no ser la más perfecta, pero es la más razonable y eficiente, al menos la OMI. – yorkw

Respuesta

45

Hay más formas de obtener un objeto LayoutInflater que directamente desde Activity. Como cuestión de hecho, getLayoutInflater() es probablemente sólo un método de conveniencia para esto:

LayoutInflater li = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

Por favor, consulte la documentación de LayoutInflater.

+0

Lo hice y probé algo similar cuando comencé, no sé por qué no funcionó esa vez, pero ahora sí :). Muchas gracias. –

3

leer esto ...

Application Fundamentals

... especialmente el bit de Actividades en la sección de componentes de aplicación.

NO intente crear una instancia de Activity utilizando new. Un Activity es una clase de Android para casos especiales y NO se debe tratar como una clase Java normal. Un Activity solo debe iniciarse usando un Intent y es responsabilidad del sistema operativo Android crear instancias de este.

En otras palabras, no hacer esto ...

Adapter MyGridAdapter = new Adapter(); 

Además, Adapter es el nombre de una clase widget Android por lo que no es una buena opción para el nombre de una de sus propias clases.

EDIT: Véase también mi respuesta a esta pregunta here sobre la creación de una clase de ayuda y pasando la actividad de Context a ella.

+0

Ya lo estoy haciendo, envío contexto al BaseAdapter ... El problema es que obtengo el 'El método getLayoutInflater() no está definido para el tipo ImageAdapter', por eso estoy extendiendo a la Actividad –

+0

Obviamente, no leyó el comentario en mi respuesta, donde le explico a la otra persona que use 'mContext.getSystemService (...)' en su caso. Lo mismo se aplica a su 'MyContext' (que debe comenzar con una letra minúscula por convención). Puede usar 'MyContext.getLayoutInflater()' alternativamente 'getApplicationContext(). GetLayoutInflater()' debería funcionar. De cualquier manera, nunca intente crear una instancia de 'Activity' con' new'. – Squonk

+0

Leí lo que publica y lo intenté ... Estoy intentando 'LayoutInflater li = MyContext.getLayoutInflater();' (Solucionaré casos más adelante, ya que parte del código no es mío) y muestra una 'El método getLayoutInflater() no está definido para el tipo Context' –

1

debe pasar el contexto de MainActivity cuando se crea un objeto de la clase que se extiende baseadapter algo como esto LayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;

que pondría en tela MyContext a una actividad y luego GetLayoutInflater() podría llamarse !!

2

La mejor manera es usar un objeto de método estático LayoutInflator con applicationcontext como el único parámetro para obtener el inflador.

Cuestiones relacionadas