首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android:在单独的类文件中使用BaseAdapter和getLayoutInflater

Android:在单独的类文件中使用BaseAdapter和getLayoutInflater
EN

Stack Overflow用户
提问于 2011-12-29 07:35:41
回答 3查看 34.6K关注 0票数 25

现在,为了填充我的GridViews,我在我的每个Android活动(大多数都是)上使用了一个扩展的BaseAdapter类。

为了便于阅读和维护,我尝试将所有的BaseAdapter代码放在一个单独的类文件中。

为了填充GridView,我使用了LayoutInflater,这就是事情变得棘手的地方……

因为getLayoutInflater()来自android.Activity,所以它不会起作用。我尝试使我的Adapter.java(填充GridViews的类)成为一个扩展的Activity类,然后在内部创建BaseAdapter类(我现在就是这样做的),但是我一直无法使它正常工作。

下面是Adapter.java的外观:

代码语言:javascript
复制
//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;
   }
}
}

要从外部调用它,我执行以下操作:

代码语言:javascript
复制
//MainClass.java
Adapter MyGridAdapter = new Adapter();
MyGrid = (GridView)findViewById(R.id.grid);
MyGrid.setAdapter(MyGridAdapter.new ImageAdapter(this, 6, nombreTema));

应用程序可以运行,但在尝试填充时,我得到了一个NullPointerException getLayoutInflater()。

有人知道我错过了什么,或者知道如何让它正常工作吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-29 08:27:18

除了直接从Activity获取LayoutInflater对象之外,还有更多的方法可以获取。事实上,getLayoutInflater()可能只是一种方便的方法:

代码语言:javascript
复制
LayoutInflater li = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

请参阅LayoutInflater的文档。

票数 70
EN

Stack Overflow用户

发布于 2014-12-22 17:49:15

在创建扩展baseadapter的类的对象时,应该传递MainActivity的上下文,如下所示的LayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;

这会将MyContext强制转换为活动,然后可以调用GetLayoutInflater()!!

票数 4
EN

Stack Overflow用户

发布于 2017-07-16 01:30:35

最好的方法是使用一个静态方法LayoutInflator对象,并将applicationcontext作为唯一的参数来获取膨胀器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8662494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档