Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自定义ArrayAdapter:为什么我会得到NullPointerException?_Android_Gallery_Adapter_Android Arrayadapter_Android Gallery - Fatal编程技术网

Android 自定义ArrayAdapter:为什么我会得到NullPointerException?

Android 自定义ArrayAdapter:为什么我会得到NullPointerException?,android,gallery,adapter,android-arrayadapter,android-gallery,Android,Gallery,Adapter,Android Arrayadapter,Android Gallery,很抱歉打扰了这么精通的人,但我是Android新手,我正在努力学习 无论如何,我正在尝试用一个自定义适配器构建一个库 但是只要程序尝试调用适配器,我就会得到NullPointerException 非常感谢任何帮助 public class MainActivity extends Activity { private Gallery gal; private List<Elementi> el; @Override protected void on

很抱歉打扰了这么精通的人,但我是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,我想这是你的错误。
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

我认为在自定义适配器的
getView()
视图行中
null

所以这个代码行
txt.setText(el.get(position.tx))为您提供
NullPointerException

实际上,您必须检查
convertView
是否为
NULL
NOT

如果
convertView
NULL
,则必须再次膨胀XML布局

大概

View row = convertView;  
if(row == null)
{
 LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
 row = inflater.inflate(R.layout.row);    
}
如果(convertView==null)需要检查
如果需要,则需要为新视图充气,或者可以让超级类处理此问题:

public View getView(int position, View convertView,ViewGroup parent) {
    if(convertView == null)
        convertView = super.getView(position, convertView, parent);
    ...
} 
演示:或由首席Android程序员进行的演示将帮助您了解如何使用
getView()
,而不会减慢应用程序的速度


添加
从您的日志中:

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!
private List el;//这一个是空的,是传递给适配器的
@凌驾
创建时受保护的void(Bundle savedInstanceState){
List el=new ArrayList();//这个只存在于onCreate中!
我真的不喜欢Java让您在没有警告的情况下这样做……只需将最后一行更改为:

protected void onCreate(Bundle savedInstanceState) {
    el = new ArrayList<Elementi>();
创建时受保护的void(Bundle savedInstanceState){
el=新的ArrayList();

(但是,如果不按上面所述寻址
getView()
,您将遇到另一个NullPointerException。)

问得太多没问题,但是请发布你的日志猫。哪一行给出NPE?请发布日志猫的堆栈跟踪。我更新了你日志猫的答案,你不小心创建了两个
el
…太棒了!!!!!就是这样!!!!!非常感谢!!!!谢谢,但inflate要求两个参数(Int,ViewGroup)谢谢,但是inflate要求两个参数(Int,ViewGroup)谢谢,但是我得到了相同的结果。
protected void onCreate(Bundle savedInstanceState) {
    el = new ArrayList<Elementi>();