Android: BaseAdapter и getLayoutInflater для отдельного файла класса - PullRequest
21 голосов
/ 29 декабря 2011

Прямо сейчас, чтобы заполнить свои GridViews, я использую расширенный класс BaseAdapter для каждой из моих операций в Android (которых большинство из них).

Чтобы упростить чтение и обслуживание, я`Я пытаюсь поместить весь код 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 ]

59 голосов
/ 29 декабря 2011

Существует больше способов получить объект LayoutInflater, чем непосредственно из Activity. На самом деле, getLayoutInflater(), вероятно, просто удобный метод для этого:

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

См. Документацию для LayoutInflater.

3 голосов
/ 22 декабря 2014

вы должны передать контекст MainActivity при создании объекта класса, который расширяет baseadapter примерно так: LayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;

, это приведёт MyContext к Activity, и тогда GetLayoutInflater () может быть вызван !!

3 голосов
/ 29 декабря 2011

Читать это ...

Основы применения

... особенно немного о Действиях в разделе Компоненты приложения.

НЕ пытайтесь создать экземпляр Activity, используя new. Activity - это особый класс Android, и его НЕ следует рассматривать как обычный класс Java. Activity следует запускать только с использованием Intent, и ОС Android отвечает за его создание.

Другими словами, никогда не делай этого ...

Adapter MyGridAdapter = new Adapter();

Кроме того, Adapter - это имя класса виджета Android, поэтому он не является хорошим выбором для имени одного из ваших собственных классов.

РЕДАКТИРОВАТЬ: Также см. Мой ответ на этот вопрос здесь о создании вспомогательного класса и передаче ему Context действия.

2 голосов
/ 15 июля 2017

Лучший способ - использовать статический метод LayoutInflator объект с applicationcontext в качестве единственного параметра для получения инфлятора.

...