我正在制作一个自定义GridView
适配器,用于设置FrameLayout
及其UI用户(图片)。适配器本身并不复杂,但我得到编译时错误Variable imgThumb have not been initialized
。更糟糕的是,代码与Google Developer GridView help page上的代码完全相同。
这是我的适配器:
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private int mGroupId;
private Bitmap[] rescaledImages;
private Integer[] which;
public ImageAdapter(Context c, int groupId) {
mContext = c;
mGroupId = groupId;
//.. do init of rescaledImages array
}
public int getCount() {
return rescaledImages.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
View frameLayout;
ImageView imgThumb;
if (convertView == null) { // if it's not recycled, initialize some attribute
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
frameLayout = inflater.inflate(R.layout.group_grid_item, null);
frameLayout.setLayoutParams(new AbsListView.LayoutParams(130, 130));
frameLayout.setPadding(0, 10, 0, 10);
imgThumb = (ImageView) frameLayout.findViewById(R.id.grid_item_thumb);
} else {
frameLayout = (FrameLayout) convertView;
}
imgThumb.setImageBitmap(rescaledImages[position]); //<-- ERRROR HERE!!!
return frameLayout;
}
//...
现在,我知道我可以在ImageView imgThumb=null;
方法中设置getView()
,但我不确定为什么此示例适用于Android开发人员帮助页面。
此外,我不确定是否应该imgThumb
永远null
- 这是否会导致运行时错误?
答案 0 :(得分:1)
该代码与您链接的代码不同,即使您设置imgThumb = null
,代码也会崩溃。因为在convertView != null
的情况下,imgThumb
永远不会被设置为任何内容,因此会在imgThumb.setImageBitmap(rescaledImages[position]);
行上崩溃。
答案 1 :(得分:0)
仅当您的convertView不为null时才会发生这种情况!因此,您必须在'if'子句之外初始化imgThumb。
答案 2 :(得分:0)
感谢@LuckyMe(你没有回复整个解决方案)。
无论如何,对于那些喜欢我想要初始化并使用GridView
单元格及其子元素的根元素的人,你应该注意默认初始化每个子元素 else
使用convertView.findViewById()
方法。
即,我的代码必须修改如下:
if (convertView == null) { // if it's not recycled, initialize some attribute
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
frameLayout = inflater.inflate(R.layout.group_grid_item, null);
frameLayout.setLayoutParams(new AbsListView.LayoutParams(130, 130));
frameLayout.setPadding(0, 10, 0, 10);
imgThumb = (ImageView) frameLayout.findViewById(R.id.grid_item_thumb);
}
else {
frameLayout = (FrameLayout) convertView;
imgThumb = (ImageView) convertView.findViewById(R.id.grid_item_thumb); //INITIALIZE EACH CHILD AS WELL LIKE THIS!!!
}