25

现在要填充我的 GridViews,我在我的每个 Android 活动(其中大部分)上都使用了扩展的 BaseAdapter 类。

为了使其更易于阅读和维护,我尝试将所有 BaseAdapter 代码放在一个单独的类文件中。

为了填充 GridView,我使用了 LayoutInflater,这就是事情变得棘手的地方......

由于 getLayoutInflater() 来自android.Activity,它不会成功。我尝试使我的 Adapter.java(填充 GridViews 的类)成为扩展的 Activity 类,然后在内部创建 BaseAdapter 类(我现在这样做的方式),但我无法使其正常工作。

下面是 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;
   }
}
}

要从外部调用它,我执行以下操作:

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

该应用程序运行,但在尝试填充时,我得到了 NullPointerException getLayoutInflater()。

有人知道我缺少什么,或者如何使其正常工作?

4

4 回答 4

70

获取LayoutInflater对象的方法比直接从Activity. 事实上,getLayoutInflater()这可能只是一种方便的方法:

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

请参阅文档LayoutInflater

于 2011-12-29T00:27:17.647 回答
4

您应该在创建扩展 baseadapter 的类的对象时传递 MainActivity 的上下文,如下所示 LayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;

这会将 MyContext 转换为 Activity,然后可以调用 GetLayoutInflater() !

于 2014-12-22T09:49:14.867 回答
3

读这个...

应用基础

...尤其是“应用程序组件”部分中有关活动的部分。

不要尝试实例化Activityusing new。AnActivity是一个特殊的 Android 类,不应像普通 Java 类一样对待。AnActivity只能使用 an 来启动,Intent并且它是 Android 操作系统的责任来实例化它。

换句话说,永远不要这样做......

Adapter MyGridAdapter = new Adapter();

此外,Adapter是 Android 小部件类的名称,因此对于您自己的类之一的名称不是一个好的选择。

编辑:另请参阅我对这个问题回答,关于创建一个助手类并将活动传递Context给它。

于 2011-12-28T23:57:45.340 回答
2

最好的方法是使用LayoutInflator带有applicationcontext的静态方法对象作为获取inflator的唯一参数。

于 2017-07-15T17:30:35.480 回答