【问题标题】:Android: BaseAdapter and getLayoutInflater on separate class fileAndroid:BaseAdapter 和 getLayoutInflater 在单独的类文件上
【发布时间】:2011-12-28 23:35:41
【问题描述】:

现在,为了填充我的 GridView,我在我的每个 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()。

有人知道我缺少什么,或者如何使它正常工作?

【问题讨论】:

  • GDActivity 是否扩展Activity
  • 是的,是一个 Greendroid Activity
  • 从OO的角度来看,Adapter不是一个Activity,你的代码就是不合理。你追求简单却以时间和复杂性告终,谷歌推荐的方式可能不是最完美的,但它是最合理和最有效的,至少是 IMO。
  • 我知道这有点奇怪,但我找不到任何其他方法。我只需要让 BaseAdapter 工作

标签: android android-gridview baseadapter


【解决方案1】:

获取LayoutInflater 对象的方法比直接从Activity 中获取的方法更多。事实上,getLayoutInflater() 可能只是一个方便的方法:

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

请参阅LayoutInflater 的文档。

【讨论】:

  • 我在开始时做过并尝试过类似的东西,不知道为什么那个时候它不起作用,但现在它起作用了:)。非常感谢。
【解决方案2】:

在创建扩展 baseadapter 的类的对象时,您应该传递 MainActivity 的上下文 像这样的东西 LayoutInflater inflater = ((Activity)MyContext)).getLayoutInflater;

这会将 MyContext 转换为 Activity,然后可以调用 GetLayoutInflater()!

【讨论】:

    【解决方案3】:

    阅读本文...

    Application Fundamentals

    ...尤其是应用程序组件部分的活动部分。

    不要尝试使用new 实例化ActivityActivity 是一个特殊的 Android 类,不应将其视为常规 Java 类。 Activity 只能使用 Intent 启动,并且它是 Android 操作系统的责任实例化它。

    换句话说,永远不要这样做......

    Adapter MyGridAdapter = new Adapter();
    

    另外,Adapter 是 Android 小部件类的名称,因此不适合作为您自己的类之一的名称。

    编辑:另请参阅我对这个问题的回答 here 关于创建帮助程序类并将活动的 Context 传递给它。

    【讨论】:

    • 我已经这样做了,我将上下文发送到 BaseAdapter... 问题是我得到了The method getLayoutInflater() is undefined for the type ImageAdapter,这就是我扩展到 Activity 的原因
    • 您显然没有阅读我的回答的评论,我向其他人解释在他的情况下使用mContext.getSystemService(...)。这同样适用于您的MyContext(按照惯例应以小写字母开头)。您可以使用MyContext.getLayoutInflater() 或者getApplicationContext().getLayoutInflater() 应该可以工作。无论哪种方式,都不要尝试用new 实例化Activity
    • 我确实阅读了您发布的内容,并尝试了...我正在尝试LayoutInflater li = MyContext.getLayoutInflater();(我稍后会修复案例,因为某些代码不是我的)并且它显示了@987654339 @
    • 好的,抱歉,它需要转换为Activity,如((Activity)MyContext).getLayoutInflater()。我看到你已经接受了一个答案并让它工作,但是从ContextActivity 的转换可能在未来的情况下对你有用。
    • 是的,这会很有帮助。非常感谢。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2017-08-04
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多