Android: BaseAdapter and getLayoutInflater on separate class file-ThrowExceptions

Exception or error:

Right now to populate my GridViews I’m using a extended BaseAdapter class on each of my Android Activities (which are most of them).

In order to make it easier to read and maintain, I`m trying to put all the BaseAdapter code in a separate class file.

To populate the GridView, I’m using LayoutInflater, and here is where stuff gets tricky…

Since the getLayoutInflater() comes from android.Activity, it just won’t do the trick. I tried making my Adapter.java(the class to populate the GridViews) a extended Activity class, and then inside create the BaseAdapter class (the way I do it right now), but I haven’t been able to make it work properly.

Here’s how Adapter.java looks:

//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;
   }
}
}

To call it from the outside, I do the following:

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

The app runs, but when trying to populate, I got a NullPointerException getLayoutInflater().

Someone knows what I’m missing, or how to make it work properly?

How to solve:

There are more ways to get a LayoutInflater object than directly from an Activity. As a matter of fact, getLayoutInflater() is probably just a convenience method for this:

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

Please see the documentation for LayoutInflater.

###

you should pass the context of MainActivity when creating an object of the class that extends baseadapter
something like this
LayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;

this would cast MyContext to an Activity and then GetLayoutInflater() could be called!!

###

Read this…

Application Fundamentals

…especially the bit on Activities in the Application Components section.

Do NOT try to instantiate an Activity using new. An Activity is a special-case Android class and should NOT be treated like a regular Java class. An Activity should only be started using an Intent and it’s the Android OS’s responsibility for instantiating it.

In other words, never do this…

Adapter MyGridAdapter = new Adapter();

Also, Adapter is the name of an Android widget class so not a good choice for the name of one of your own classes.

EDIT: Also see my answer to this question here about creating a helper class and passing the activity’s Context to it.

###

The best way is to use a static method LayoutInflator object with applicationcontext as the only parameter to get inflator.

Leave a Reply

Your email address will not be published. Required fields are marked *