乌龟赛跑

你在某件事上花费的时间都是值得的。

二十三、发帖多图选择

在发帖时,可以从手机相册选择图片,最多可以选择9张。要实现的效果如图所示:

单击右上角的勾勾选择图片或者取消选择。

一开始我的实现逻辑是这样的:

1、在adapter里面的绑定ViewHolder时,设置勾勾的点击事件:

vh.hookImageView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (hookClickListener != null) {
            hookClickListener.onChange(position, v);
        }
    }
});
回调接口:
public interface HookClickListener {
    void onChange(int position, View v);
}
2、在activity里面设置上述回调监听,并实现:

private MultiSelectPhotoAdapter.HookClickListener hookClickListener = new MultiSelectPhotoAdapter.HookClickListener() {
    @Override
    public void onChange(int position, View v) {
        if (!v.isSelected()) {
            if (selectPhotos.size() >= maxNum) {
                showToast(R.string.photo_over_tip);
                return;
            }
            selectPhotos.add(mPhotoAdapter.data.get(position));
        } else {
            selectPhotos.remove(mPhotoAdapter.data.get(position));
        }
        v.setSelected(!v.isSelected());
    }
};
当没有选中时,先看是否已经选择了9张图片,则提示“最多只能选择9张图片”,没有选中9张,则增加到选中列表;反之,从选中列表中remove掉。设置select状态。这样做有很大的问题,点击右上角的勾勾时,经常选不上或者错乱。后来我分析,应该是ItemView复用导致的,view与position已经不对应了。
改良型代码如下,完美解决上述问题:

1、在adapter里面增加一个列表专门存放select状态:

private SparseBooleanArray selectArray;

public MultiSelectPhotoAdapter(List<String> data, Context context, int itemSize) {
    super(data, context);
    this.itemSize = itemSize;
    selectArray = new SparseBooleanArray(data.size());
}
用SparseBooleanArray因为它的效率比较高,android做过优化,比HashMap效率高,它采用折半查找。

封装使用SparseBooleanArray的getter和setter方法:

public boolean getSelect(int position) {
    return selectArray.get(position, false);
}

public void setSelect(int position, boolean b) {
    selectArray.put(position, b);
    notifyDataSetChanged();
}
在设置select状态时,通知adapter变更,重新绘制。

2、下面这两步和上面类似,只是实现方法有所改变。在adapter里面的绑定ViewHolder时,设置勾勾的点击事件:

viewHolder.hookImageView.setSelected(getSelect(position));  // --------------1
viewHolder.hookImageView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (hookClickListener != null) {
            hookClickListener.onChange(position);
        }
    }
});
可以看到在1的地方多了一句,这里就是重点,把勾勾的select状态与SparseBooleanArray绑定在了一起,当SparseBooleanArray中的select状态改变时,调用notifyDataSetChanged()方法重绘ItemView的选中状态。

回调接口:

public interface HookClickListener {
    void onChange(int position);
}
2、在activity里面设置上述回调监听,并实现:

private MultiSelectPhotoAdapter.HookClickListener hookClickListener = new MultiSelectPhotoAdapter.HookClickListener() {
    @Override
    public void onChange(int position) {
        if (!mPhotoAdapter.getSelect(position)) {
            if (selectPhotos.size() >= maxNum) {
                showToast(R.string.photo_over_tip);
                return;
            }
            selectPhotos.add(mPhotoAdapter.data.get(position));
        } else {
            selectPhotos.remove(mPhotoAdapter.data.get(position));
        }
        mPhotoAdapter.setSelect(position, !mPhotoAdapter.getSelect(position));
    }
};


参考:

http://blog.csdn.net/xiangzilv1987/article/details/8209903

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu75567218/article/details/52366803
个人分类: keng
想对作者说点什么? 我来说一句

易语言分类信息自动发帖源码

2012年10月31日 1.54MB 下载

phpwind自动登陆+自动发帖

2010年06月20日 3KB 下载

GalleryFinalDemo

2017年01月04日 7.63MB 下载

仿微信多图选择

2016年03月14日 3.54MB 下载

相册图片选择

2016年03月31日 2.67MB 下载

Android 多图选择

2015年07月06日 6.58MB 下载

没有更多推荐了,返回首页

不良信息举报

二十三、发帖多图选择

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭