【问题标题】:Custom ArrayAdapter: why do I get a NullPointerException?自定义 ArrayAdapter:为什么会出现 NullPointerException?
【发布时间】:2012-11-29 20:20:29
【问题描述】:

很抱歉打扰了这么精通的人,但我是Android新手,我正在努力学习......

无论如何,我正在尝试使用自定义适配器构建画廊。

但是一旦程序尝试调用适配器,我就会得到 NullPointerException。

非常感谢任何帮助!!!!

public class MainActivity extends Activity {
    private Gallery gal;
    private List<Elementi> el;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        List<Elementi> el = new ArrayList<Elementi>();
        int[] tabDrawables = new int[] {
                     R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img1,R.drawable.img4,R.drawable.    img5,R.drawable.img6,R.drawable.img7,R.drawable.img8,R.drawable.img9,R.drawable.img10};

        String[] descrizione =    {"cani","boffo","gigo","belo","fyyfy","bogin","boginetti","zippe","ninne","cestino","cagnin    o","cucciolo",};

        for (int numero =1; numero <= 10;numero++) {

            ImageView imgm = new ImageView(this);
            imgm.setImageResource(tabDrawables[numero]);
            el.add(new Elementi(imgm,descrizione[numero]));

        };


        super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
        Gallery gal=(Gallery)findViewById(R.id.galleria);
        gal.setAdapter(new MyAdapter());


    }
public class MyAdapter extends ArrayAdapter<Elementi> {
    public MyAdapter() {
        super(MainActivity.this, R.layout.row, el);
    }   
    public View getView(int position, View convertView,ViewGroup parent) {
                View row= convertView;  
                TextView txt =(TextView)row.findViewById(R.id.testorow);
                txt.setText(el.get(position).tx) ;
                ImageView ima =(ImageView)row.findViewById(R.id.immagine);
                ima.setImageResource(R.drawable.img1);
                Toast.makeText(getApplicationContext(), Inte    ger.toString(position), Toast.LENGTH_LONG).show();      
                return row;};

}    


public class Elementi { 
public ImageView im;
public String tx; 
public Elementi(ImageView img,String txt){
        ImageView im =img;
        String tx = txt;        

    }

}

}

我的 LogCat:

11-29 20:26:28.327: E/AndroidRuntime(786): FATAL EXCEPTION: main
11-29 20:26:28.327: E/AndroidRuntime(786): java.lang.RuntimeException: Unable to start     activity ComponentInfo{com.example.gallery/com.example.gallery.MainActivity}:    java.lang.NullPointerException
11-29 20:26:28.327: E/AndroidRuntime(786):  at      android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
11-29 20:26:28.327: E/AndroidRuntime(786):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
11-29 20:26:28.327: E/AndroidRuntime(786):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
11-29 20:26:28.327: E/AndroidRuntime(786):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
11-29 20:26:28.327: E/AndroidRuntime(786):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-29 20:26:28.327: E/AndroidRuntime(786):  at android.os.Looper.loop(Looper.java:137)
11-29 20:26:28.327: E/AndroidRuntime(786):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
11-29 20:26:28.327: E/AndroidRuntime(786):  at java.lang.reflect.Method.invokeNative(Native Method)
11-29 20:26:28.327: E/AndroidRuntime(786):  at java.lang.reflect.Method.invoke(Method.java:511)
11-29 20:26:28.327: E/AndroidRuntime(786):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-29 20:26:28.327: E/AndroidRuntime(786):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-29 20:26:28.327: E/AndroidRuntime(786):  at dalvik.system.NativeStart.main(Native Method)
11-29 20:26:28.327: E/AndroidRuntime(786): Caused by: java.lang.NullPointerException
11-29 20:26:28.327: E/AndroidRuntime(786):  at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)
11-29 20:26:28.327: E/AndroidRuntime(786):  at android.widget.AbsSpinner.setAdapter(AbsSpinner.java:114)
11-29 20:26:28.327: E/AndroidRuntime(786):  at com.example.gallery.MainActivity.onCreate(MainActivity.java:52)
11-29 20:26:28.327: E/AndroidRuntime(786):  at android.app.Activity.performCreate(Activity.java:5104) 
11-29 20:26:28.327: E/AndroidRuntime(786):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
11-29 20:26:28.327: E/AndroidRuntime(786):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
11-29 20:26:28.327: E/AndroidRuntime(786):  ... 11 more
11-29 20:26:28.547: D/dalvikvm(786): GC_CONCURRENT freed 387K, 17% free 2496K/3000K, paused 13ms+24ms, total 191ms

【问题讨论】:

  • 问太多没问题,但请发布你的logcat。
  • 哪一行给出了 NPE?请从 logcat 发布堆栈跟踪。
  • 我为你的 LogCat 更新了我的答案,你不小心创建了 两个el 副本...
  • 太棒了!!!!而已!!!!!!非常感谢!!!!

标签: android gallery adapter android-arrayadapter android-gallery


【解决方案1】:

你需要检查if(convertView == null),什么时候你需要膨胀一个新的视图,或者你可以让超类处理这个:

public View getView(int position, View convertView,ViewGroup parent) {
    if(convertView == null)
        convertView = super.getView(position, convertView, parent);
    ...
} 

主要 Android 程序员的演示文稿:Turbo Charge Your UIWorld of ListView 将帮助您了解如何使用 getView() 而不会降低您的应用速度。


加法
从您的 LogCat:

Caused by: java.lang.NullPointerException
    at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)

这意味着您传递给 ArrayAdapter 的列表是 null...

这是因为您有 两个 el 的不同副本:

private List<Elementi> el; // This one is null and is what's passed to your adapter
@Override
protected void onCreate(Bundle savedInstanceState) {
    List<Elementi> el = new ArrayList<Elementi>(); // This one only exists in onCreate!

我不太喜欢 Java 如何让您在没有警告的情况下执行此操作...只需将最后一行更改为:

protected void onCreate(Bundle savedInstanceState) {
    el = new ArrayList<Elementi>();

(但是,如果您不按上述方式处理getView(),您将遇到另一个 NullPointerException。)

【讨论】:

    【解决方案2】:

    没有看到 logcat,我认为这是你的错误。 getView() 方法的convertView 参数在第一次调用该方法时为空。你的工作是在convertView == null 时为视图充气:

    public View getView(int position, View convertView,ViewGroup parent) {
       View row= convertView;  
       if(row==null){
            LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
            row = inflater.inflate(R.layout.mylayout, parent, false);    
       }
    
       TextView txt =(TextView)row.findViewById(R.id.testorow);
       //(...) more code
    }
    

    当再次调用getView() 时,它会将这个View 用作convertView,因此convertView 可能不会是null

    【讨论】:

    • 谢谢,但是 inflate 需要两个参数(Int,ViewGroup)
    • 谢谢,但我得到了相同的结果。
    【解决方案3】:

    我认为在您的自定义适配器中 getView() View rownull

    所以这行代码txt.setText(el.get(position).tx); 给你NullPointerException

    其实你要检查convertViewNULL还是NOT

    如果convertViewNULL,那么您必须再次扩充 XML 布局。

    类似的,

    View row = convertView;  
    if(row == null)
    {
     LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
     row = inflater.inflate(R.layout.row);    
    }
    

    【讨论】:

    • 谢谢,但是 inflate 需要两个参数(Int,ViewGroup)
    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    相关资源
    最近更新 更多