Android:单独类文件上的BaseAdapter和getLayoutInflater

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (84)

现在,为了填充我的GridViews,我在我的每个Android活动上都使用了一个扩展的BaseAdapter类(这是其中的大多数)。

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

为了填充GridView,我使用了LayoutInflater,这里的东西变得很棘手

因为getLayoutInflater()来自android.Activity,它就是起不了什么作用。我试着将Adapter.java(填充GridViews的类)变成扩展的活动类,然后在内部创建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()。

有人知道我错过了什么,或者怎么让它正常工作?

提问于
用户回答回答于

有更多的方法可以获得LayoutInflater对象,而不是直接从Activity。事实上,getLayoutInflater()可能只是一种方便的方法:

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

用户回答回答于

不要尝试实例化Activity使用newActivity是一个特殊的Android类,不应该像普通的Java类那样对待。一个Activity只使用开始Intent和它的Android操作系统的实例化它的责任。

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

Adapter MyGridAdapter = new Adapter();

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

扫码关注云+社区