最近自己闲着无聊,私下写了一个仿微信的照片选择器,其中的GridView中用到CheckBox,但是每次加载的时候,都会出现数据错乱,还有一点就是,为啥每次滑动的时候都会加载第一条数据(position=0),纳闷还是不清楚,有知道的麻烦告诉我一下:
下面是我的适配器:
package com.jaki.photopicker.adapters; import android.content.Context; import android.content.Intent; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.jaki.photopicker.R; import com.jaki.photopicker.activities.PhotoPickerActivity; import com.jaki.photopicker.activities.PhotoPreviewActivity; import com.jaki.photopicker.beans.PhotoBean; import java.util.ArrayList; import java.util.List; /** * 图片选择适配器 * Created by Jaki on 2017/3/27. */ public class PhotoPickerAdapter extends BaseAdapter{ private static final String TAG = PhotoPickerAdapter.class.getSimpleName(); public static final String KEY_EXTRA_TO_PHOTO_PREVIEW = "key_extra_to_photo_preview";//key public static final String KEY_TOTAL_QUANTITY = "key_total_quantity";//照片总数 public static final String KEY_CURRENT_COUNT = "key_current_count";//照片当前位置 public static final String KEY_MAX_QUANTITY = "key_max_quantity";//照片最大数量 public static final String KEY_CURRENT_CHOOSED_COUNT = "key_current_choosed_count";//当前选中的照片数量 public static final String KEY_CHOOSED_STATUS = "key_choosed_status";//当前选中的照片数量 public static final int MY_RESULT_CODE = 88; private Context context; private List<PhotoBean> list; private LayoutInflater inflater; private int[] counts; private int count; private Button bSend; public PhotoPickerAdapter(Context context, List<PhotoBean> list, int[] counts,Button bSend) { this.context = context; this.list = list; inflater = LayoutInflater.from(context); this.counts = counts; this.bSend = bSend; } @Override public int getCount() { return list == null ? 0 : list.size(); } @Override public Object getItem(int position) { //Log.e("bbb2","position---"+position+" , "+list.get(position).isCheckedStatus()); return list == null ? null : list.get(position); } @Override public long getItemId(int position) { return position; } int m= 0; @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null){ convertView = inflater.inflate(R.layout.layout_photo_picker,parent,false); viewHolder = new ViewHolder(convertView); viewHolder.imageView = (ImageView)convertView.findViewById(R.id.iv_photo_picker_adapter); viewHolder.checkBox = (CheckBox)convertView.findViewById(R.id.cb_photo_picker_adapter); convertView.setTag(viewHolder); }else { viewHolder = ((ViewHolder) convertView.getTag()); } Glide.with(context) .load(list.get(position).getPath()) .override(150,150) .placeholder(R.mipmap.img_default) .diskCacheStrategy(DiskCacheStrategy.ALL) .into( viewHolder.imageView); boolean checkedStatus = list.get(position).isCheckedStatus(); Log.e("bbb","position---"+position+" , "+checkedStatus); viewHolder.checkBox.setChecked(checkedStatus); viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { list.get(position).setCheckedStatus(isChecked); Log.e("bbb2","position---"+position+" , "+list.get(position).isCheckedStatus()); PhotoBean item = (PhotoBean) getItem(position); } }); viewHolder.imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(context, PhotoPreviewActivity.class); intent.putExtra(KEY_EXTRA_TO_PHOTO_PREVIEW,list.get(position)); intent.putExtra(KEY_TOTAL_QUANTITY,list.size()); intent.putExtra(KEY_CURRENT_COUNT,position); intent.putExtra(KEY_MAX_QUANTITY,counts[1]); intent.putExtra(KEY_CURRENT_CHOOSED_COUNT,counts[0]); intent.putExtra(KEY_CHOOSED_STATUS,list.get(position).isCheckedStatus()); ((PhotoPickerActivity)context).startActivityForResult(intent,MY_RESULT_CODE); } }); return convertView; } class ViewHolder{ private View convertView; private ImageView imageView;//显示单张图片 private CheckBox checkBox;//显示是否选中该图片 public ViewHolder(View convertView) { this.convertView = convertView; } } }下面是我的GridView的单行布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_centerInParent="true" android:scaleType="fitXY" android:id="@+id/iv_photo_picker_adapter" android:src="@mipmap/ic_launcher" android:layout_width="120dp" android:layout_height="120dp" /> <!--android:button="@drawable/selector_gridview_adapter_img_picker"--> <CheckBox android:layout_alignRight="@id/iv_photo_picker_adapter" android:layout_alignTop="@id/iv_photo_picker_adapter" android:id="@+id/cb_photo_picker_adapter" android:layout_width="30dp" android:layout_height="30dp" /> </RelativeLayout>在这样子运行后打出的log如下:
04-05 16:15:04.631 28804-28804/com.jaki.photopicker E/bbb: position---0 , false
04-05 16:15:04.732 28804-28804/com.jaki.photopicker E/bbb: position---0 , false
04-05 16:15:04.837 28804-28804/com.jaki.photopicker E/bbb: position---0 , false
04-05 16:15:04.842 28804-28804/com.jaki.photopicker E/bbb: position---1 , false
04-05 16:15:04.847 28804-28804/com.jaki.photopicker E/bbb: position---2 , false
04-05 16:15:04.854 28804-28804/com.jaki.photopicker E/bbb: position---3 , false
04-05 16:15:04.859 28804-28804/com.jaki.photopicker E/bbb: position---4 , false
04-05 16:15:04.863 28804-28804/com.jaki.photopicker E/bbb: position---5 , false
04-05 16:15:04.868 28804-28804/com.jaki.photopicker E/bbb: position---6 , false
04-05 16:15:04.873 28804-28804/com.jaki.photopicker E/bbb: position---7 , false
04-05 16:15:04.878 28804-28804/com.jaki.photopicker E/bbb: position---8 , false
04-05 16:15:04.882 28804-28804/com.jaki.photopicker E/bbb: position---9 , false
04-05 16:15:04.886 28804-28804/com.jaki.photopicker E/bbb: position---10 , false
04-05 16:15:04.890 28804-28804/com.jaki.photopicker E/bbb: position---11 , false
04-05 16:15:04.894 28804-28804/com.jaki.photopicker E/bbb: position---12 , false
04-05 16:15:04.898 28804-28804/com.jaki.photopicker E/bbb: position---13 , false
04-05 16:15:04.904 28804-28804/com.jaki.photopicker E/bbb: position---14 , false
04-05 16:15:04.911 28804-28804/com.jaki.photopicker E/bbb: position---0 , false
04-05 16:15:04.913 28804-28804/com.jaki.photopicker E/bbb: position---0 , false
04-05 16:15:05.058 28804-28804/com.jaki.photopicker E/bbb: position---0 , false
04-05 16:15:05.060 28804-28804/com.jaki.photopicker E/bbb: position---0 , false
04-05 16:15:25.141 28804-28804/com.jaki.photopicker E/bbb2: position---0 , true
04-05 16:15:25.145 28804-28804/com.jaki.photopicker E/bbb2: PhotoBean{name='70417862.jpeg', path='/storage/emulated/0/DCIM/Camera/70417862.jpeg', date=Sun Jan 18 12:59:50 GMT+08:00 1970, size=124072, isCheckedStatus=true, isSendOrignal=false}
04-05 16:16:27.652 28804-28804/com.jaki.photopicker E/bbb: position---15 , false
04-05 16:16:27.693 28804-28804/com.jaki.photopicker E/bbb: position---16 , false
04-05 16:16:27.698 28804-28804/com.jaki.photopicker E/bbb: position---17 , false
04-05 16:16:28.929 28804-28804/com.jaki.photopicker E/bbb: position---18 , false
04-05 16:16:28.932 28804-28804/com.jaki.photopicker E/bbb: position---19 , false
04-05 16:16:28.934 28804-28804/com.jaki.photopicker E/bbb: position---20 , false
04-05 16:16:28.935 28804-28804/com.jaki.photopicker E/bbb2: position---0 , false
04-05 16:16:28.936 28804-28804/com.jaki.photopicker E/bbb2: PhotoBean{name='70417862.jpeg', path='/storage/emulated/0/DCIM/Camera/70417862.jpeg', date=Sun Jan 18 12:59:50 GMT+08:00 1970, size=124072, isCheckedStatus=false, isSendOrignal=false}
04-05 16:16:28.990 28804-28804/com.jaki.photopicker E/bbb: position---0 , false
04-05 16:16:28.992 28804-28804/com.jaki.photopicker E/bbb: position---0 , false
04-05 16:16:30.806 28804-28804/com.jaki.photopicker E/bbb: position---21 , false
04-05 16:16:30.807 28804-28804/com.jaki.photopicker E/bbb: position---22 , false
04-05 16:16:30.809 28804-28804/com.jaki.photopicker E/bbb: position---23 , false
log中04-05 16:15:25.141 28804-28804/com.jaki.photopicker E/bbb2: position---0 , true时候我点击了第一项的CheckBox,继续滑动后,当第一项滑出屏幕,自动变成false,这个应该是CheckBox的监听改的(我猜的)
这地方不懂的是,为啥position---0 的log会多次打出,因为他已经不在屏幕里了???????
这个问题的解决方式是:
先把CheckBox的监听设成null,然后设置CheckBox的值,最后再设置监听,
getview()中的关于CheckBox代码改成如下:
viewHolder.checkBox.setOnCheckedChangeListener(null); viewHolder.checkBox.setChecked(checkedStatus); viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { list.get(position).setCheckedStatus(isChecked); Log.e("bbb2","position---"+position+" , "+list.get(position).isCheckedStatus()); PhotoBean item = (PhotoBean) getItem(position); Log.e("bbb2",item+""); //bSend.setText("发送("+counts[0]+"/"+counts[1]+")"); } });