Android: BaseAdapter et getLayoutInflater sur le fichier de classe
Dès maintenant à remplir mes GridViews je suis en utilisant une étendue BaseAdapter classe sur chacun de mes Android Activités (qui sont pour la plupart d'entre eux).
Afin de le rendre plus facile à lire et à maintenir, je suis en train de mettre tous les BaseAdapter code dans un fichier de classe.
Pour remplir le GridView, je suis en utilisant LayoutInflater, et c'est là où les choses deviennent difficiles...
Depuis le getLayoutInflater() vient de android.Activity
, il ne veut tout simplement pas faire l'affaire. J'ai essayé de faire mon Adapter.java(la classe pour remplir le GridViews) prolongée de l'Activité de la classe, et puis à l'intérieur de créer le BaseAdapter classe (la façon dont je le fais en ce moment), mais je n'ai pas été capable de le faire fonctionner correctement.
Voici comment Adapter.java regarde:
//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;
}
}
}
Appeler ça de l'extérieur, je ne les suivants:
//MainClass.java
Adapter MyGridAdapter = new Adapter();
MyGrid = (GridView)findViewById(R.id.grid);
MyGrid.setAdapter(MyGridAdapter.new ImageAdapter(this, 6, nombreTema));
L'application s'exécute, mais lorsque j'essaie de remplir, j'ai eu une NullPointerException getLayoutInflater().
Quelqu'un sait ce que je suis absent, ou comment le faire fonctionner correctement?
- Ne GDActivity étendre
Activity
? - Yup, est un Greendroid Activité
- De OO point de vue, l'Adaptateur n'est pas une Activité, votre code n'est tout simplement pas raisonnable. Vous recherchez la simplicité, mais avec le temps et la complexité, la façon dont Google recommandé pourrait ne pas être le plus parfait, mais il est le plus raisonnable et efficace, au moins de l'OMI.
- Je sais, c'est un peu bizarre, mais je ne pouvais pas trouver un autre moyen de le faire. Tout ce que je besoin est de faire de la BaseAdapter de travail
Vous devez vous connecter pour publier un commentaire.
Il y a plusieurs façons d'obtenir un
LayoutInflater
objet que directement à partir d'unActivity
. Comme une question de fait,getLayoutInflater()
est probablement juste une méthode pratique pour cela:Consultez la documentation pour
LayoutInflater
.Lire ceci...
Application Des Fondamentaux
...en particulier le bit sur les Activités dans les Composants de l'Application de la section.
N'essayez PAS d'instancier un
Activity
à l'aide denew
. UnActivity
est un cas spécial Android classe et ne doit PAS être traitée comme un simple classe Java. UnActivity
ne doit être démarré à l'aide d'unIntent
et c'est le système d'exploitation Android de la responsabilité de son instanciation.En d'autres termes, ne jamais faire cela...
Aussi,
Adapter
est le nom d'un widget Android classe donc pas un bon choix pour le nom de l'un de vos propres classes.EDIT: voir Aussi ma réponse à cette question ici sur la création d'une classe d'assistance et de passage de l'activité
Context
à elle.The method getLayoutInflater() is undefined for the type ImageAdapter
, c'est pourquoi Im extension de l'ActivitémContext.getSystemService(...)
dans son cas. La même chose s'applique à votreMyContext
(qui devrait commencer par une lettre minuscule, par convention). Vous pouvez utiliserMyContext.getLayoutInflater()
sinongetApplicationContext().getLayoutInflater()
devrait fonctionner. De toute façon, ne jamais essayer d'instancier unActivity
avecnew
.LayoutInflater li = MyContext.getLayoutInflater();
(je vais corriger les cas plus tard, puisque le code n'est pas le mien) et il montre uneThe method getLayoutInflater() is undefined for the type Context
Activity
comme dans((Activity)MyContext).getLayoutInflater()
. Je vois que vous avez accepté la réponse et avoir de travail, mais qui jettent deContext
àActivity
peut être utile pour vous dans des situations futures.vous devez passer le contexte de MainActivity lors de la création d'un objet de la classe qui étend la classe baseadapter
quelque chose comme ceci
LayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;
ce serait jeté MyContext à une Activité et ensuite GetLayoutInflater() peut être appelée!!
Le meilleur moyen est d'utiliser une méthode statique
LayoutInflator
objet avec applicationcontext comme le seul paramètre pour obtenir de gonflage.