前一段时间一直有一个问题困扰着我,就是listView中item的复用问题,从数据库请求下来的状态,然后会错乱,比如item被选中,然后在拉下去再返回去状态就改变
其实问题很简单,就是用一个map存储起来你的状态,然后在判断完convertview之后,赋值的时候设置判断
我的是从服务器读取的状态
因为重写的getView()是每次item出现的时候都要运行一遍,所以就在getView之后的
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
final Message message = datas.get(position);
if(convertView == null){
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.message_item_layout, null);
viewHolder.iconurl = (ImageView)convertView.findViewById(R.id.icon);
viewHolder.name = (TextView)convertView.findViewById(R.id.name);
viewHolder.title = (TextView)convertView.findViewById(R.id.title);
viewHolder.time = (TextView)convertView.findViewById(R.id.time);
viewHolder.isRead = (TextView)convertView.findViewById(R.id.isRead);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder)convertView.getTag();
}
mActivity.loadImage(message.getSendUserIcon(), viewHolder.iconurl);
viewHolder.title.setText(message.getLetterTitle());
viewHolder.name.setText(message.getSendUserName());
viewHolder.time.setText(message.getLetterTime());
//这就是重新设置状态的地方
if(message.getIsCheck()){
viewHolder.isRead.setVisibility(View.GONE);
}else{
viewHolder.isRead.setVisibility(View.VISIBLE);
}
return convertView;
}
if(message.getIsCheck()){
viewHolder.isRead.setVisibility(View.GONE);
}else{
viewHolder.isRead.setVisibility(View.VISIBLE);
}
注意:if() else 都要写
问题就解决了
至于其他的不复用解决问题的方法就不提了,容易oom ,这是我觉得解决问题最好方式