Android 自定义ArrayAdapter:为什么我会得到NullPointerException?
很抱歉打扰了这么精通的人,但我是Android新手,我正在努力学习 无论如何,我正在尝试用一个自定义适配器构建一个库 但是只要程序尝试调用适配器,我就会得到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
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>();