原创

屏幕适配-ListView-GridView上滑动后数据错乱、数据混乱

/////////////////////////////////////////////////////////////////////////////////
另外 setTag
getTag
http://blog.csdn.net/zhufui/article/details/46907027
另外在ImageView中加载url图片时,也需要判断一下,防止错位

不含有图片时:
mHolder.edittext.setTag(position);// 粗暴的使用position也行
//逻辑操作中
if ((Integer) mHolder.edPrdRectify.getTag() == position) {
//某一个editText失去焦点会导致所有的item都执行一遍这
//里的代码,且position的值是当前值,所以,所有list中item数据都修改
listOfPendingRectifyInfos.get(position).setRectifiReplySituation(arg0.toString());
//业务处理
}

/////////////////////////////////////////////////////////////////////////////////
对于不同判断条件设置不同的文字颜色或背景这一类问题时
滚动出现颜色错位,但是数据正确,这说明仅仅是控件颜色没有正常渲染,没有写else。
if(A){
setColor(a);
}else{//关键
setColor(b);
}
////////////////////////////////////////////////////////////////////////////////
含有分页加载时:

holder.checkbox
                .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
    // 这里可能还需要设置list中的对应position的checkbox为isChecked,否则只能在刷新后才能取出数据
                        if (getSelectedCount() - alreadyChoosedList.size() >= maxCount) {
                            holder.checkbox.setChecked(false);// 跟这个有关系么
                            return;
                        }
                        if (isChecked) {
                            viewDatas.get(position).setSaveCheckStatus(1);//单独用一个字段保证checkbox的状态
                                                                            // 重要!!
                        } else {
                            viewDatas.get(position).setSaveCheckStatus(0);//单独用一个字段保证checkbox的状态
                        }

                    }
                });
        if (/* isFirstIn && 这里就不能在要了,会有问题 */alreadyChoosedList != null
                && alreadyChoosedList.contains(viewDatas.get(position).path)) {// 应该是这里出的错

            if (viewDatas.get(position).isHasInited == false) {
                /**
                 * isHasInited 只针对分页加载时
                 * 禁止页面刷新后又自动初始化之前默认选中的值,isFirstIn只能控制无分页加载的情况
                 */
                holder.checkbox.setChecked(true);
                viewDatas.get(position).setChecked(true);
                viewDatas.get(position).setSaveCheckStatus(1);// 保存状态 重要!!
                viewDatas.get(position).setHasInited(true); // 下次不再执行
            }

        }

        if (viewDatas.get(position).getSaveCheckStatus() == 0) {// 显示状态 重要!!
            holder.checkbox.setChecked(false);
            viewDatas.get(position).setChecked(false);
        } else {
            holder.checkbox.setChecked(true);
            viewDatas.get(position).setChecked(true);
        }

        if (position == viewDatas.size() - 4) {// 提前加载
            /**
             * isHasInited 只针对分页加载时 禁止页面刷新后又自动初始化之前默认选中的值,isFirstIn只能控制无分页加载的情况
             */
            isFirstIn = false;

            if (mLoadMoreCallBack != null) {
                mLoadMoreCallBack.loadMore();
            }

        }

/////////////////////////////////////////////////////////////////////////////////
mViewHolder.amaiCheckBox
                .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
                         /**
                         * 这里需要设置list中的对应position的checkbox为isChecked,
                         * 否则只能在刷新后才能取出数据
                         */
                         taskMembers.get(position).setCheck(isChecked);    
                            
                        if (isChecked) {
                            taskMembers.get(position).setSaveCheckStatus(1);//单独用一个字段保证checkbox的状态
                            ;// 状态一定要保存起来
                        } else {
                            taskMembers.get(position).setSaveCheckStatus(0);//单独用一个字段保证checkbox的状态
                                // 状态一定要保存起来
                        }

                    }
                });

        // mViewHolder.amaiCheckBox
        // .setChecked(taskMembers.get(position).isCheck()); //不需要写

        Logs.d("test", "滚动  position " + position);
        if (isFirstIn == true
                && taskMembers.get(position).getUserNumber()
                        .equals(Global.getUser().getUserNumber())) {//第一次初始化View时
            Logs.d("test", "滚动 等于自己时 position " + position);
            if (taskMembers.get(position).isHasInited() == false) {
                /**
                 * isHasInited 主要是针对分页加载
                 */
                mViewHolder.amaiCheckBox.setChecked(true);
                mViewHolder.amaiCheckBox.setClickable(false);
                mViewHolder.amaiCheckBox.setEnabled(false);

                taskMembers.get(position).setCheck(true);
                taskMembers.get(position).setSaveCheckStatus(1);// 保存状态 重要!!
                taskMembers.get(position).setHasInited(true); // 下次不再执行
                mViewHolder.amaiCheckBox.setTag(position);
            }

        }

        /**
         * 对于 setChecked setEnabled setClickable 这几个方法 必须要set相反的属性进去!!!
         */
        if (taskMembers.get(position).getSaveCheckStatus() == 0) {// 显示状态 重要!!
            mViewHolder.amaiCheckBox.setChecked(false);
            mViewHolder.amaiCheckBox.setEnabled(true);
            mViewHolder.amaiCheckBox.setClickable(true);// 必须
            taskMembers.get(position).setCheck(false);

        } else {
            if (taskMembers.get(position).getUserNumber()
                    .equals(Global.getUser().getUserNumber())) {//某一个固定值
                Logs.d("test", "滚动 等于自己时2 position " + position);
                mViewHolder.amaiCheckBox.setChecked(true);
                mViewHolder.amaiCheckBox.setClickable(false);// 必须
                mViewHolder.amaiCheckBox.setEnabled(false);

            } else {
                mViewHolder.amaiCheckBox.setChecked(true);
                mViewHolder.amaiCheckBox.setEnabled(true);
                mViewHolder.amaiCheckBox.setClickable(true);// 必须
                taskMembers.get(position).setCheck(true);
            }

        }
        mViewHolder.amaiName.setText(taskMembers.get(position).getMansName());
        mViewHolder.amaiPhoneNumber.setText(taskMembers.get(position)
                .getManPhoneNum());

        if (position == taskMembers.size() - 1) {
            isFirstIn = false;
        }

正文到此结束
本文目录