在用ListView过程中,遇到了这个问题。。。

我查了一下ListView运行机制:
在一个完整的ListView第一次出现时,每个Item都是Null的,getView的时候会跑到需要inflate一个Item的代码段,假设整个view只能最多显示10个item,那么当滑动到第11个Item的时候,第一个item会放入“recycler”,如果第11个Item和放入“Recycler”的item的view一致,那么就会使用"Recycler"里面的Item来显示,从而不用再重复inflate一次,这样大大节省了创建View的工作,在需要显示大量数据时显得尤为重要。
程序开始是可以运行的,当我下滑到底后,反向上滑,加载前面的view时出现这个错误。
这是我程序的代码:
java
package com.kingtime.buytogether.widget;
import java.util.List;
import com.kingtime.buytogether.AppContext;
import com.kingtime.buytogether.R;
import com.kingtime.buytogether.bean.ChatRecord;
import com.kingtime.buytogether.bean.User;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class ChatMsgAdapter extends BaseAdapter {
private int[] imgs = { R.drawable.face, R.drawable.widget_dface };
public static interface IMsgViewType {
int IMVT_COM_MSG = 0;// 别人的消息
int IMNT_TO_MSG = 1;// 自己的消息
}
private static final int ITEMCOUNT = 2;
private List<ChatRecord> recordLsit;
private Context context;
private LayoutInflater mInflater;
public ChatMsgAdapter(Context context, List<ChatRecord> recordList) {
this.recordLsit = recordList;
this.context = context;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return recordLsit.size();
}
@Override
public Object getItem(int position) {
return recordLsit.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ChatRecord record = recordLsit.get(position);
AppContext aContext = (AppContext) context;
User user = aContext.getLoginInfo();
boolean isComMsg = (record.getUid() == user.getUid()) ? false: true;
ViewHolder viewHolder = null;
if(convertView == null){
if(isComMsg){
convertView = mInflater.inflate(R.layout.chat_text_left_item,null);
}
else{
convertView = mInflater.inflate(R.layout.chat_text_right_item, null);
}
viewHolder = new ViewHolder();
viewHolder.tvSendTime = (TextView)convertView.findViewById(R.id.tv_sendtime);
viewHolder.tvUserName = (TextView)convertView.findViewById(R.id.tv_username);
viewHolder.tvContent = (TextView)convertView.findViewById(R.id.tv_chatcontent);
viewHolder.icon = (ImageView)convertView.findViewById(R.id.iv_userhead);
viewHolder.isComMsg = isComMsg;
}
else{
viewHolder = (ViewHolder)convertView.getTag();
}
System.out.println("NOW--LOADING--" + record.getChatId() + ",AND LIST--NUM--IS:" + recordLsit.size());
System.out.println("RECORD_TIME:" + record.getChatTime());
viewHolder.tvSendTime.setText(record.getChatTime());
System.out.println(record.getChatTime());
viewHolder.tvContent.setText(record.getContent());
System.out.println(record.getContent());
viewHolder.tvUserName.setText(String.valueOf(record.getUid()));//Todo
System.out.println(record.getUid());
viewHolder.icon.setImageResource(imgs[0]);
System.out.println("ChatRecord Load OK!!!");
return convertView;
}
static class ViewHolder {
public TextView tvSendTime;
public TextView tvUserName;
public TextView tvContent;
public ImageView icon;
public boolean isComMsg = true;
}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<include layout="@layout/loginheader"/>
<ListView
android:id="@+id/chat_listview"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:layout_weight="10"