2011-12-28 1 views
16

今私は自分のAndroidアクティビティ(ほとんどのもの)に拡張BaseAdapterクラスを使用しています。Android:BaseAdapterと別のクラスファイルのgetLayoutInflater

読みやすく保守しやすくするために、私はすべての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()。

誰かが迷っていることや、正しく動作させる方法を知っていますか?

+0

GDActivityは「アクティビティ」を延長しますか? – Squonk

+0

はい、Greendroidアクティビティです –

+0

OOの観点からは、アダプタはアクティビティではなく、あなたのコードは妥当ではありません。あなたはシンプルさを探しますが、時間と複雑さに終わります.Googleが推奨する方法は最も完璧ではないかもしれませんが、少なくともIMO以上で最も合理的で効率的です。 – yorkw

答えて

45

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

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

LayoutInflaterのためのマニュアルを参照してください。

+0

私がやったことを似たようなものを試してみたところ、なぜその時間にはうまくいかなかったのですか? ありがとうございます。 –

3

...

Application Fundamentals

...アプリケーションコンポーネントセクションでの活動で特にビットをこれをお読みください。

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

、これを行うことはありません...

Adapter MyGridAdapter = new Adapter(); 

はまた、Adapterは、Androidのウィジェットクラスの名前そうではない、独自のクラスの1つの名前のために良い選択です。

EDIT:はまた、ヘルパークラスを作成し、それに活動のContextを渡すことについては、この質問hereに私の答えを参照してください。

+0

Imはすでにこれを行っています。私はBaseAdapterにコンテキストを送ります...問題は、 'getAddLayoutInflater()メソッドが型ImageAdapter'に対して定義されていないということです。アクティビティ –

+0

あなたは明らかに私の答えにコメントを読まなかったので、彼のケースでは 'mContext.getSystemService(...)'を使用するよう他人に説明しています。同じことがあなたの 'MyContext'にも当てはまります(これは、大文字で始まる小文字で始まります)。代わりに、 'MyContext.getLayoutInflater()'を使うことができます。 'getApplicationContext()。getLayoutInflater()'が動作するはずです。いずれにせよ、 'new'で' Activity'をインスタンス化しようとしないでください。 – Squonk

+0

あなたが投稿したものを読んで、試しました... 'LayoutInflater li = MyContext.getLayoutInflater();'しようとしています(コードの一部が私のものではないので後で修正します)。 'メソッドContext' –

1

このアクティビティにあるMyContextをキャストしてGetLayoutInflater(うこの LayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;

ようbaseadapter 何かを拡張するクラスのオブジェクトを作成するときにMainActivityのコンテキストを渡す必要があります)が呼び出される可能性!

2

インフレータを取得する唯一のパラメータとして、applicationcontextを使用して静的メソッドLayoutInflatorを使用することをお勧めします。

関連する問題