hacer - gridview android studio example
Android: BaseAdapter y getLayoutInflater en un archivo de clase separado (4)
Ahora mismo, para rellenar mis GridViews, estoy usando una clase extendida de BaseAdapter en cada una de mis actividades de Android (que son la mayoría)
Para facilitar la lectura y el mantenimiento, estoy intentando colocar todo el código de BaseAdapter en un archivo de clase separado.
Para poblar el GridView, estoy usando LayoutInflater, y aquí es donde las cosas se ponen difíciles ...
Dado que getLayoutInflater () proviene de android.Activity
, simplemente no funcionará. Intenté hacer de Adapter.java (la clase para poblar GridViews) una clase de actividad extendida, y luego crear la clase BaseAdapter (la forma en que lo hago ahora), 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 llamarlo 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));
La aplicación se ejecuta, pero cuando intento rellenar, obtuve una excepción NullPointerException getLayoutInflater ().
¿Alguien sabe lo que me falta o cómo hacerlo funcionar correctamente?
Hay más formas de obtener un objeto LayoutInflater
que directamente desde una Activity
. De hecho, getLayoutInflater()
es probablemente solo un método conveniente para esto:
LayoutInflater li = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Por favor, consulte la documentación de LayoutInflater
.
La mejor manera es usar un método LayoutInflator
Objeto LayoutInflator
con applicationcontext como único parámetro para obtener el inflador.
Lee esto...
... especialmente el bit en Actividades en la sección Componentes de la aplicación.
NO intente crear una instancia de una Activity
usando una new
. Una Activity
es una clase de Android de casos especiales y NO debe ser tratada como una clase Java normal. Una Activity
solo debe iniciarse utilizando un Intent
y es responsabilidad del sistema operativo Android crear una instancia.
En otras palabras, nunca hagas esto ...
Adapter MyGridAdapter = new Adapter();
Además, Adapter
es el nombre de una clase de widget de Android por lo que no es una buena opción para el nombre de una de sus propias clases.
EDITAR: También vea mi respuesta a esta pregunta here acerca de cómo crear una clase de ayuda y pasarle el Context
la actividad.
debe pasar el contexto de MainActivity cuando cree un objeto de la clase que amplíe baseadapter algo como esto LayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;
¡esto convertiría MyContext en una actividad y luego se podría llamar a GetLayoutInflater ()!