前一段時間一直有一個問題困擾着我,就是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 ,這是我覺得解決問題最好方式