我的一个片段中有一个列表视图,直到今天我将其高度设置为固定的400dp。现在我已将其更改为0dp并使用布局中的其他视图和按钮对其进行加权。但是,在进行更改后,我开始获取空指针。显然,当为列表中的项调用getView()时,尝试使用view.findViewById()获取像textview这样的资源会突然返回null。只有当滚动条可见并且我试图向下滚动时才会发生这种情况。
在做了一些研究后,我注意到只要从被移动的滚动条触发getView(),视图就会设置为convertView。 convertView实际上是一个textView出于某种原因?为什么会被转换为convertView?为什么这个工作在一个固定的高度,我该如何解决这个问题?
@Override
public View getView(LayoutInflater inflater, View convertView) {
View view;
if (convertView == null) {
view = (View) inflater.inflate(R.layout.interview_item, null);
// Do some initialization
} else {
view = convertView;
}
//Crash on the next line with an error that text1 is a null pointer
TextView text1 = (TextView) view.findViewById(R.id.name);
TextView text2 = (TextView) view.findViewById(R.id.job);
TextView text3 = (TextView) view.findViewById(R.id.time);
ImageButton image = (ImageButton) view.findViewById(R.id.interview_type);
text1.setText(this.getCandidate().getName());
text2.setText(this.getJob().getTitle());
//Parse the time of day from the date and format it
SimpleDateFormat timeFmtOut = new SimpleDateFormat("h:mm a");
text3.setText(timeFmtOut.format(this.getDate() ));
if(this.type == interviewType.PHONE_CALL)
image.setImageResource(R.drawable.phone_interview);
else
image.setImageResource(R.drawable.person_interview);
return view;
}
thanks
答案 0 :(得分:0)
它正在使用固定高度,因为视图已经初始化为if部分,它不会进入其他部分。 但是当滚动到来时,一旦创建了视图,它就会重用视图,所以它转到了else部分,并且你已经初始化了view = convertView,但是当时convertView为null,因此view为null。 所以它正在为findViewById()而崩溃。 当convertView对象已经存在时,无需再使用一个视图 所以将代码更改为以下内容。
@Override
public View getView(LayoutInflater inflater, View convertView) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.interview_item, null);
//initialization of views goes here
TextView text1 = (TextView) convertView .findViewById(R.id.name);
TextView text2 = (TextView) convertView .findViewById(R.id.job);
TextView text3 = (TextView) convertView .findViewById(R.id.time);
ImageButton image = (ImageButton) convertView .findViewById(R.id.interview_type);
} else {
// do something here
}
//set data here
text1.setText(this.getCandidate().getName());
text2.setText(this.getJob().getTitle());
//Parse the time of day from the date and format it
SimpleDateFormat timeFmtOut = new SimpleDateFormat("h:mm a");
text3.setText(timeFmtOut.format(this.getDate() ));
if(this.type == interviewType.PHONE_CALL)
image.setImageResource(R.drawable.phone_interview);
else
image.setImageResource(R.drawable.person_interview);
return convertView;
}
最佳做法是使用ViewHolder Pattern。