二十三、发帖多图选择

原创 2016年08月30日 10:31:34

在发帖时,可以从手机相册选择图片,最多可以选择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

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS 自定义多张图片选择+demo

if ([phoneVersion integerValue] >= 8) {         //高版本使用PhotoKit框架         [self getHeightVersionA...
  • wangxinxu521
  • wangxinxu521
  • 2017年06月05日 15:39
  • 1869

android多图选择

最近项目中用到多图选择上传的需求,随后百度了一下用了别人写的demo,发现在很多机型上各种不适,闪退等问题,严复影响使用,后面我自己写了一个,公司20几款手机全部通过,在腾讯云测中也使用了4,50款手...
  • Luck_mw
  • Luck_mw
  • 2017年01月04日 16:10
  • 2772

Android自定义View 简单实现多图片选择控件

前言相信很多朋友在开发中都会遇到图片上传的情况,尤其是多图上传,最 经典的莫过于微信的图片选择了。所有很多情况下会使用到多图选择。 所以就有了这篇文章,今天抽点时间写了个控件。...
  • yissan
  • yissan
  • 2016年07月22日 16:47
  • 6363

【Android源码解析】选择多张图片上传多图预览

最近做了选择多图并且上传服务器,在网上找了一些demo,适当的做了一下调整,用过了不能忘记,记下来以后还能多看看,本人觉得自己的博客有些渣渣,还希望大家不要介意啊,哪里有错误希望大家及时指正。   好...
  • lyhhj
  • lyhhj
  • 2015年08月17日 22:46
  • 10681

白话空间统计二十三:回归分析(五)

白话空间统计二十三:回归分析(五)回归应用 当然,在说这个之前,先回答大家关心的几个问题。关于回归分析写了四章了,不知道大家是不是和我一样有这样一个问题:这个东东我就看见了一堆概念,这个东西...
  • allenlu2008
  • allenlu2008
  • 2017年02月27日 14:42
  • 1095

ionic选择多张图片上传

使用Cordova ImagePicker插件及File Transfer插件实现选择本地多张图片上传到服务器...
  • u013007703
  • u013007703
  • 2016年11月19日 15:58
  • 3438

多段图的最短路径问题-----动态规划法

对多段图,求最短路径,如图: 对其使用动态规划法: 阶段:将图中的顶点划分5个阶段,k 状态:每个阶段有几种供选择的点s 决策:当前状态应在前一个状态的基础上获得。决策需要满足规划方程 ...
  • huahuahailang
  • huahuahailang
  • 2013年06月06日 22:27
  • 18119

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传

仿照微信,朋友圈分享图片功能 。可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 。很不错的源码,大家有需要可以下载看看 。 ...
  • u011730649
  • u011730649
  • 2016年08月29日 18:48
  • 2506

Python人人小组自动发帖

事情起因:由于玩人人上的某个游戏的时候,与某人起了一点冲突,当时为了泄愤,打算写个程序,如果能每隔5min在游戏的小组内发个帖子就好了,于是就有了这个程序。 天助我也:一般的贴吧,发帖的时候需要输...
  • zhenyu5211314
  • zhenyu5211314
  • 2014年03月12日 13:24
  • 1680

编程之美之寻找发帖水王

简单来说就是求一个数组中出现次数超过一半的次数的数(保证存在),最容易想到的就是先排序,再返回中间位置的值。 优化方式就是每次删去两个不相等的数,最后找不到不相等的数,那么最后剩下的数就是这个出现次...
  • fengsigaoju
  • fengsigaoju
  • 2017年04月01日 15:56
  • 224
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二十三、发帖多图选择
举报原因:
原因补充:

(最多只允许输入30个字)