gridview中使用CheckBox,解决CheckBox数据加载错乱问题

最近自己闲着无聊,私下写了一个仿微信的照片选择器,其中的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]+")");
    }
});

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值