2011-12-28 3 views
16

Прямо сейчас, чтобы заполнить мои GridViews Я использую расширенный класс BaseAdapter для каждого из моих Android-мероприятий (большинство из них).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 'Activity'? – Squonk

+0

Yup, является активностью Greendroid –

+0

С точки зрения OO, адаптер не является активностью, ваш код просто не разумен. Вы ищете простоту, но в конечном итоге со временем и сложностью, то, как рекомендовал Google, может быть не самым совершенным, но это самый разумный и эффективный, по крайней мере, ИМО. – yorkw

ответ

45

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

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

Пожалуйста, обратитесь к документации по LayoutInflater.

+0

Я сделал и попробовал что-то подобное при запуске, не знаю почему это не сработало в то время, но теперь это делает :). Большое спасибо. –

3

Прочитайте это ...

Application Fundamentals

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

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

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

Adapter MyGridAdapter = new Adapter(); 

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

EDIT: Также см моего ответа на этот вопрос here о создании вспомогательного класса и прохождения на данном виде деятельности Context к нему.

+0

Я уже делаю это, я отправляю контекст в BaseAdapter ... Проблема в том, что я получаю метод getLayoutInflater() для типа ImageAdapter(), поэтому Im расширяется to Activity –

+0

Вы, очевидно, не прочитали комментарий к моему ответу, где я объясняю другому человеку использовать 'mContext.getSystemService (...)' в своем случае. То же самое относится к вашему «MyContext» (который должен начинаться с буквы нижнего регистра по соглашению). Вы можете использовать 'MyContext.getLayoutInflater()' альтернативно 'getApplicationContext(). GetLayoutInflater()' должен работать. В любом случае, никогда не пытайтесь создать экземпляр 'Activity' с' new'. – Squonk

+0

Я прочитал то, что вы публикуете, и попробовал ... Im пытается 'LayoutInflater li = MyContext.getLayoutInflater();' (я буду исправлять случаи позже, так как некоторые из кода не мои), и он показывает 'Метод getLayoutInflater() не определен для типа Context' –

1

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

это было бы бросить MyContext на операцию, а затем GetLayoutInflater() можно было бы назвать !!

2

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

Смежные вопросы