我想要运行一个ArrayList< Object>其中包含一些不同类型的ArrayList。但每个类型都由ItemProperties扩展,其中包含有关类型的基本信息,如名称和图片(.getName()和.getPicture())。
ArrayList<Object> lists = new ArrayList<Object>();
lists.add(listType1); //Class Type1 extends ItemProperties
lists.add(listType2); //Class Type2 extends ItemProperties
lists.add(listType3); //Class Type3 extends ItemProperties
for (Object o : lists) {
ArrayList<ItemProperties> al = (ArrayList<ItemProperties>) o;
for (ItemProperties p : al) { //Nullpointer Exception here
if (getString(p.getName()).toLowerCase().contains(arg0.toLowerCase())) {
Drawable icon = getResources().getDrawable(p.getPicture());
TextView tv = new TextView(this);
tv.setTextSize(20);
tv.setTextColor(Color.WHITE);
tv.setGravity(Gravity.CENTER_VERTICAL);
tv.setText(p.getName());
ll.addView(tv); //LinearLayout ll
icon.setBounds(0, 0, tv.getLineHeight() * 3, tv.getLineHeight() * 3);
tv.setCompoundDrawables(icon, null, null, null);
}
}
我怎样才能让它发挥作用?
答案 0 :(得分:1)
NullPointerException与您设置列表的方式无关。但是,如果您所说的是正确的,那么第一个列表将包含列表,而这些列表将包含扩展ItemProperties的元素,那么您应该为其键入列表。
List<List<ItemProperties>> lists = new ArrayList<List<ItemProperties>>();
答案 1 :(得分:0)
声明变量但未创建对象时会发生 NullPointerException 。当您尝试使用指向内存中没有位置的引用时,就会发生此异常,就像引用对象一样。
NullPointerException 本身足以告诉您尚未正确初始化ArrayList。如果您仍有问题,请发布stackTrace()
。
答案 2 :(得分:-1)
我有一些改进当前代码的建议。您可以使用以下语法更强烈地键入它,而不是定义用于保存列表的对象列表:
ArrayList< ArrayList<? extends ItemProperties> > lists = new ArrayList<>();
所以现在当你循环浏览列表时,你不必在for-each
循环中输入你的元素。
for (ArrayList<? extends ItemProperties> o : lists) {
// Do something
}