这个问题主要是因为视图没有保存造成的。举例,原问题代码:
package com.zyf.filetrans.adapter;
import android.content.Context;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.zyf.filetrans.MyApp;
import com.zyf.filetrans.R;
import com.zyf.filetrans.Utils.FileUtils;
import com.zyf.filetrans.Utils.LogUtil;
import com.zyf.filetrans.core.entity.SendPackItem;
import com.zyf.filetrans.core.entity.SendPackage;
import com.zyf.filetrans.core.utils.SendPackageUtil;
import com.zyf.filetrans.ui.ChooseItemsActivity;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ItemInfoAdapter extends BaseAdapter {
private static final String TAG=ItemInfoAdapter.class.getSimpleName();
private Context mContext;
private SendPackage mSendPack;
private Handler mHandler;
List<Map.Entry<String, SendPackItem>> mList;
public ItemInfoAdapter(Context mContext) {
this.mContext = mContext;
mSendPack= MyApp.getAppContext().getmSendPackage();
mList=new ArrayList<Map.Entry<String,SendPackItem>>(mSendPack.getSendList().entrySet());
}
public void setHandler(Handler handler){
mHandler=handler;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position).getValue();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final SendPackItem sendPackItem = (SendPackItem) getItem(position);
if (convertView == null) {
convertView = View.inflate(mContext, R.layout.item_trans_choose, null);
viewHolder = new ItemInfoAdapter.ItemsHolder();
viewHolder.iv_shortcut = (ImageView) convertView.findViewById(R.id.iv_shortcut);
viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
viewHolder.tv_item_info = (TextView) convertView.findViewById(R.id.tv_item_info);
viewHolder.tv_desc = (TextView) convertView.findViewById(R.id.tv_desc);
viewHolder.iv_tick = (ImageView) convertView.findViewById(R.id.iv_tick);
viewHolder.cb_choose = (CheckBox) convertView.findViewById(R.id.cb_choose);
convertView.setTag(viewHolder);
} else {
viewHolder = (ItemInfoAdapter.ItemsHolder) convertView.getTag();
}
if (sendPackItem != null) {
viewHolder.iv_tick.setVisibility(View.GONE);
if (sendPackItem.getType().equals(SendPackageUtil.TAG_PICTURE)) {
viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_jpg));
viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_jpeg_desc));
} else if (sendPackItem.getType().equals(SendPackageUtil.TAG_MUSIC)) {
viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_mp3));
viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_mp3_desc));
} else if (sendPackItem.getType().equals(SendPackageUtil.TAG_VIDEO)) {
viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_mp4));
viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_mp4_desc));
} else if (sendPackItem.getType().equals(SendPackageUtil.TAG_APK)) {
viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk));
viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_apk_desc));
} else if (sendPackItem.getType().equals(SendPackageUtil.TAG_SYSTEM)) {
viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk));
viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_system_data_desc));
} else if (sendPackItem.getType().equals(SendPackageUtil.TAG_SMS)) {
viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk));
viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_sms_desc));
} else if (sendPackItem.getType().equals(SendPackageUtil.TAG_CONTACTS)) {
viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk));
viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_contacts_desc));
} else if (sendPackItem.getType().equals(SendPackageUtil.TAG_CALL_LOG)) {
viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk));
viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_calllog_desc));
}else if (sendPackItem.getType().equals(SendPackageUtil.TAG_DOC)) {
viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk));
viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_doc_desc));
}else if (sendPackItem.getType().equals(SendPackageUtil.TAG_DOWNLOAD)) {
viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk));
viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_download_desc));
}else if (sendPackItem.getType().equals(SendPackageUtil.TAG_APK_DATA)) {
viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk));
viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_apk_data_desc));
}
long total = sendPackItem.getTotalSize();
int count = sendPackItem.getTotalItems();
viewHolder.tv_item_info.setText(FileUtils.getFileSize(total) + " , " + count + "个");
viewHolder.cb_choose.setChecked(sendPackItem.isBseleced());
viewHolder.cb_choose.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
LogUtil.Logd(TAG, sendPackItem.getTotalItems() + " ," + sendPackItem.getTotalSize());
sendPackItem.setBseleced(isChecked);
if (mHandler != null) {
mHandler.obtainMessage(ChooseItemsActivity.MSG_UPDATE_ITEM_INFO, sendPackItem).sendToTarget();
}
}
});
}
return convertView;
}
static class ItemsHolder {
ImageView iv_shortcut;
TextView tv_name;
TextView tv_desc;
TextView tv_item_info;
CheckBox cb_choose;
ImageView iv_tick;
}
}
用HashMap进行保存后,问题解决:
package com.zyf.filetrans.adapter; import android.content.Context; import android.os.Handler; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; import com.zyf.filetrans.MyApp; import com.zyf.filetrans.R; import com.zyf.filetrans.Utils.FileUtils; import com.zyf.filetrans.Utils.LogUtil; import com.zyf.filetrans.core.entity.SendPackItem; import com.zyf.filetrans.core.entity.SendPackage; import com.zyf.filetrans.core.utils.SendPackageUtil; import com.zyf.filetrans.ui.ChooseItemsActivity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ItemInfoAdapter extends BaseAdapter { private static final String TAG=ItemInfoAdapter.class.getSimpleName(); private Context mContext; private SendPackage mSendPack; private Handler mHandler; private Map<Integer, View> mapView = new HashMap<Integer, View>(); List<Map.Entry<String, SendPackItem>> mList; public ItemInfoAdapter(Context mContext) { this.mContext = mContext; mSendPack= MyApp.getAppContext().getmSendPackage(); mList=new ArrayList<Map.Entry<String,SendPackItem>>(mSendPack.getSendList().entrySet()); } public void setHandler(Handler handler){ mHandler=handler; } @Override public int getCount() { return mList.size(); } @Override public Object getItem(int position) { return mList.get(position).getValue(); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final SendPackItem sendPackItem = (SendPackItem) getItem(position); ItemInfoAdapter.ItemsHolder viewHolder = null; if (!mapView.containsKey(position)) { convertView = View.inflate(mContext, R.layout.item_trans_choose, null); viewHolder = new ItemInfoAdapter.ItemsHolder(); viewHolder.iv_shortcut = (ImageView) convertView.findViewById(R.id.iv_shortcut); viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name); viewHolder.tv_item_info = (TextView) convertView.findViewById(R.id.tv_item_info); viewHolder.tv_desc = (TextView) convertView.findViewById(R.id.tv_desc); viewHolder.iv_tick = (ImageView) convertView.findViewById(R.id.iv_tick); viewHolder.cb_choose = (CheckBox) convertView.findViewById(R.id.cb_choose); convertView.setTag(viewHolder); mapView.put(position, convertView); }else{ convertView = mapView.get(position); viewHolder = (ItemInfoAdapter.ItemsHolder) convertView.getTag(); } if (sendPackItem != null) { viewHolder.iv_tick.setVisibility(View.GONE); if (sendPackItem.getType().equals(SendPackageUtil.TAG_PICTURE)) { viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_jpg)); viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_jpeg_desc)); } else if (sendPackItem.getType().equals(SendPackageUtil.TAG_MUSIC)) { viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_mp3)); viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_mp3_desc)); } else if (sendPackItem.getType().equals(SendPackageUtil.TAG_VIDEO)) { viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_mp4)); viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_mp4_desc)); } else if (sendPackItem.getType().equals(SendPackageUtil.TAG_APK)) { viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk)); viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_apk_desc)); } else if (sendPackItem.getType().equals(SendPackageUtil.TAG_SYSTEM)) { viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk)); viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_system_data_desc)); } else if (sendPackItem.getType().equals(SendPackageUtil.TAG_SMS)) { viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk)); viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_sms_desc)); } else if (sendPackItem.getType().equals(SendPackageUtil.TAG_CONTACTS)) { viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk)); viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_contacts_desc)); } else if (sendPackItem.getType().equals(SendPackageUtil.TAG_CALL_LOG)) { viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk)); viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_calllog_desc)); }else if (sendPackItem.getType().equals(SendPackageUtil.TAG_DOC)) { viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk)); viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_doc_desc)); }else if (sendPackItem.getType().equals(SendPackageUtil.TAG_DOWNLOAD)) { viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk)); viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_download_desc)); }else if (sendPackItem.getType().equals(SendPackageUtil.TAG_APK_DATA)) { viewHolder.iv_shortcut.setImageDrawable(mContext.getResources().getDrawable(R.mipmap.icon_apk)); viewHolder.tv_name.setText(mContext.getResources().getString(R.string.str_apk_data_desc)); } long total = sendPackItem.getTotalSize(); int count = sendPackItem.getTotalItems(); viewHolder.cb_choose.setTag(position); viewHolder.tv_item_info.setText(FileUtils.getFileSize(total) + " , " + count + "个"); viewHolder.cb_choose.setChecked(sendPackItem.isBseleced()); viewHolder.cb_choose.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { LogUtil.Logd(TAG,"buttonView.getTag() : "+buttonView.getTag()); sendPackItem.setBseleced(isChecked); if (mHandler != null) { mHandler.obtainMessage(ChooseItemsActivity.MSG_UPDATE_ITEM_INFO, sendPackItem).sendToTarget(); } } }); } return convertView; } static class ItemsHolder { ImageView iv_shortcut; TextView tv_name; TextView tv_desc; TextView tv_item_info; CheckBox cb_choose; ImageView iv_tick; } }