25

現在、GridViews を設定するために、各 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() が発生しました。

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

4

4 に答える 4

70

LayoutInflaterから直接オブジェクトを取得する方法よりも多くの方法がありますActivity。実際のところ、これgetLayoutInflater()はおそらく単なる便利な方法です。

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

のドキュメントを参照してくださいLayoutInflater

于 2011-12-29T00:27:17.647 に答える
4

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

これは MyContext を Activity にキャストし、GetLayoutInflater() を呼び出すことができます!!

于 2014-12-22T09:49:14.867 に答える
3

これを読む...

アプリケーションの基礎

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

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

つまり、これは絶対にしないでください...

Adapter MyGridAdapter = new Adapter();

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

編集:また、ヘルパー クラスの作成とそれにアクティビティを渡すことについて、この質問に対する私の回答も参照してくださいContext

于 2011-12-28T23:57:45.340 に答える