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

现在填充我的GridViews我在每个Android活动(这是他们大多数)使用扩展的BaseAdapter类。

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

要填充GridView,我正在使用LayoutInflater,这里是东西变得棘手的地方…

由于getLayoutInflater()来自android.Activity ,它只是不会做的伎俩。 我试图让我的Adapter.java(类填充GridViews)一个扩展的Activity类,然后在里面创buildBaseAdapter类(我现在这样做),但我一直无法正常工作。

以下是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)); 

该应用程序运行,但试图填充时,我得到了一个N​​ullPointerException getLayoutInflater()。

有人知道我错过了什么,或者如何使它正常工作?

Solutions Collecting From Web of "Android:BaseAdapter和getLayoutInflater在单独的类文件上"

获取LayoutInflater对象的方法比直接从Activity获取更多。 事实上, getLayoutInflater()可能只是一个方便的方法:

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

请参阅LayoutInflater的文档。

读这个…

应用基础

尤其是应用程序组件部分中的活动位。

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

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

 Adapter MyGridAdapter = new Adapter(); 

此外, Adapter是一个Android小部件类的名称,所以不是您自己的类的名称的好select。

编辑:另请参阅我的答案在这里关于创build一个辅助类和传递活动的Context到这个问题。

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

你应该在创build扩展baseadapter的类的对象时传递MainActivity的上下文,像这样: LayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;

这将投射MyContext到一个活动,然后GetLayoutInflater()可以被称为!