web-dev-qa-db-ja.com

Android:個別のクラスファイルのBaseAdapterとgetLayoutInflater

現在、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()が発生しました。

誰かが私が不足しているもの、またはそれを適切に機能させる方法を知っていますか?

21
Hito_kun

LayoutInflaterから直接取得する以外にも、Activityオブジェクトを取得する方法は他にもあります。実際のところ、getLayoutInflater()はおそらくこのための便利なメソッドです。

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

LayoutInflater のドキュメントをご覧ください。

60
MH.

次のようなベースアダプタを拡張するクラスのオブジェクトを作成するときは、MainActivityのコンテキストを渡す必要がありますLayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;

これにより、MyContextがアクティビティにキャストされ、GetLayoutInflater()が呼び出されます。

4
shunryui nik

これを読む...

アプリケーションの基礎

...特に「アプリケーションコンポーネント」セクションのアクティビティに関するビット。

Activityを使用してnewをインスタンス化しようとしないでください。 Activityは特別な場合Androidクラスであり、通常のJavaクラスのように扱うべきではありません。ActivityIntentを使用してのみ開始する必要があり、それはAndroidそれをインスタンス化するOSの責任です。

つまり、これを絶対に行わないでください...

Adapter MyGridAdapter = new Adapter();

また、AdapterはAndroidウィジェットクラスの名前であるため、独自のクラスの名前には適していません。

EDIT:ヘルパークラスの作成とアクティビティのContextの受け渡しについて、この質問への私の回答もご覧ください here それに。

3
Squonk

最良の方法は、inflatorを取得する唯一のパラメーターとしてapplicationcontextを含む静的メソッドLayoutInflatorオブジェクトを使用することです。

2
babak