qq_33171970
桐小目
采纳率40%
2017-02-19 09:17

Android ListView 自定义Adapter 滑动时报空指针异常

10
已采纳

问题背景:在制作一个即时聊天的APP中,聊天界面聊天消息的显示我使用了ListView,并且使用了自定义的Adapter,获取到聊天记录之后ListView可以正常显示,但是一旦滑动就会报空指针异常。我查看了很多博客,都没有提到与这个相关或者类似的错误已经被这个错误逼疯了,希望有了解的大神能够给予指点。
具体相关代码如下:
自定义的Adapter:

 public class ChatMessageAdapter extends BaseAdapter {
    private LayoutInflater layoutInflater;
    private List<MessageShow> messageShowList;


    public ChatMessageAdapter(Context context, List<MessageShow> messageShowList){
        layoutInflater = LayoutInflater.from(context);
        this.messageShowList = messageShowList;
    }

    @Override
    public int getCount() {
        return messageShowList.size();
    }

    @Override
    public Object getItem(int position) {
        return messageShowList.get(position);
    }

    @Override
    public int getItemViewType(int position) {
        if(messageShowList.get(position).getMessageType()==0)
           return 0;
        else
           return 1;
    }
    //Item类型的总数
    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        MessageShow messageShow = messageShowList.get(position);
        ViewHolder viewHolder = null;
        if(convertView == null){
            if(messageShow.getMessageType() == 0){
                convertView = layoutInflater.inflate(R.layout.from_message_item,null);
                viewHolder = new ViewHolder();
//                viewHolder.imageView = (ImageView) convertView.findViewById(R.id.from_user_icons);
                viewHolder.time = (TextView) convertView.findViewById(R.id.from_time);
                viewHolder.message = (TextView) convertView.findViewById(R.id.from_message);
            }
            else{
                convertView = layoutInflater.inflate(R.layout.to_message_item,null);
                viewHolder = new ViewHolder();
//                viewHolder.imageView = (ImageView) convertView.findViewById(R.id.to_user_icons);
                viewHolder.time = (TextView) convertView.findViewById(R.id.to_time);
                viewHolder.message = (TextView) convertView.findViewById(R.id.to_message);
            }
        }
        else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        System.out.println("我到了这里"+position);
        System.out.println("我添加了适配器: "+messageShow.getContents());
//        viewHolder.imageView.setImageResource(R.drawable.photo);
                //报空指针异常的是这里
        viewHolder.message.setText(messageShow.getContents());
        viewHolder.time.setText(messageShow.getTime());
        return convertView;
    }

    private final class ViewHolder{
//        ImageView imageView;
        TextView time;
        TextView message;
    }

,ChatActivity代码如下:

 private List<MessageShow> showMessageList;
    private ChatMessageAdapter chatMessageAdapter;
        、、、省略无关
        //初始化数据
    private void initData(){
        showMessageList = new ArrayList<MessageShow>();
        chatMessageAdapter = new ChatMessageAdapter(this,showMessageList);
        listView.setAdapter(chatMessageAdapter);
        getMessageRecord();
        chatMessageAdapter.notifyDataSetChanged();
    }

其中获取聊天记录我已经在控制台打印出来检查过了,没有错误,而ListView能够显示说明Apapter也不会有基本的错误,但是还是报空指针。我对错误的猜测如下:
虽然给的数据集可能有几十项,但是Adapter加载的时候只加载了当前显示的几项,后面的没加载,等我我滑动之后去加载的时候没加载到数据就报空指针了。但是这不太科学啊,我看了好多博客发现都没有专门说到这点,仔细检查代码也不知道应该怎么改,求指教。报错信息如下:

 I/System.out: 我到了这里1
I/System.out: 我添加了适配器: 图片这些不能点击?
I/System.out: 我到了这里2
I/System.out: 我添加了适配器: 还没做那些功能呢233
I/System.out: 我到了这里3
I/System.out: 我添加了适配器: 图片和表情
I/System.out: 我到了这里4
I/System.out: 我添加了适配器: 额 
I/System.out: 我到了这里5
I/System.out: 我添加了适配器: 准备等APP开发完之后再说
I/System.out: 我到了这里6
I/System.out: 我添加了适配器: 真的挺费脑的
I/System.out: 我到了这里7
I/System.out: 我添加了适配器: 嗯 加油
E/InputEventReceiver: Exception dispatching input event.
D/AndroidRuntime: Shutting down VM
W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa6160908)
E/AndroidRuntime: FATAL EXCEPTION: main
                  java.lang.NullPointerException
                      at cn.justwithme.withme.Adapaer.ChatMessageAdapter$override.getView(ChatMessageAdapter.java:84)
                      at cn.justwithme.withme.Adapaer.ChatMessageAdapter$override.access$dispatch(ChatMessageAdapter.java)
                      at cn.justwithme.withme.Adapaer.ChatMessageAdapter.getView(ChatMessageAdapter.java:0)

本来有十几项的,第一页只有7项,我在Adapter的输出就只出输出了7项。
图片说明
图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • qq_19729823 -小夲 4年前

    上面的回答有点问题,我想表达的意思是,你那个convertView被复用了,但是你没有setTag,并且在convertView!=null执行的时候那个里面的convertView的tag所以取不出来值,所以为null

    点赞 2 评论 复制链接分享
  • isJoker JokerWann 4年前

    楼上说得对,convertView为空时没有setTag

    点赞 2 评论 复制链接分享
  • qq_19729823 -小夲 4年前

    第一,没有调用convertview.setTag()所以后面的convertView!=null永远不会被执行。第二,你代码本身就写的有问题,那个convertView如果不为空的时候 这个回收的view有两种可能你没有区分。

    点赞 1 评论 复制链接分享

相关推荐