桐小目 2017-02-19 09:17 采纳率: 40%
浏览 1656
已采纳

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

问题背景:在制作一个即时聊天的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条回答 默认 最新

  • -小夲 2017-02-19 10:32
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆