滚动时getView()没有查找视图?

时间:2015-01-22 00:33:57

标签: java android

我的一个片段中有一个列表视图,直到今天我将其高度设置为固定的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

1 个答案:

答案 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。