问题背景:在制作一个即时聊天的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项。