現在、GridViewにデータを入力するために、各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()が発生しました。
誰かが私が不足しているもの、またはそれを適切に機能させる方法を知っていますか?
LayoutInflater
から直接取得する以外にも、Activity
オブジェクトを取得する方法は他にもあります。実際のところ、getLayoutInflater()
はおそらくこのための便利なメソッドです。
LayoutInflater li = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LayoutInflater
のドキュメントをご覧ください。
次のようなベースアダプタを拡張するクラスのオブジェクトを作成するときは、MainActivityのコンテキストを渡す必要がありますLayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;
これにより、MyContextがアクティビティにキャストされ、GetLayoutInflater()が呼び出されます。
これを読む...
...特に「アプリケーションコンポーネント」セクションのアクティビティに関するビット。
Activity
を使用してnew
をインスタンス化しようとしないでください。 Activity
は特別な場合Androidクラスであり、通常のJavaクラスのように扱うべきではありません。Activity
Intent
を使用してのみ開始する必要があり、それはAndroidそれをインスタンス化するOSの責任です。
つまり、これを絶対に行わないでください...
Adapter MyGridAdapter = new Adapter();
また、Adapter
はAndroidウィジェットクラスの名前であるため、独自のクラスの名前には適していません。
EDIT:ヘルパークラスの作成とアクティビティのContext
の受け渡しについて、この質問への私の回答もご覧ください here それに。
最良の方法は、inflatorを取得する唯一のパラメーターとしてapplicationcontextを含む静的メソッドLayoutInflator
オブジェクトを使用することです。