二十三、发帖多图选择

原创 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

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

相关文章推荐

仿5x兴趣社区发帖

仿5x兴趣社区发帖

【编程之美】2.3寻找发帖水王(数组中出现次数超过一半的数字)

题目:

编程之美2.3 寻找发帖水王

这道题目由于不容易写测试用例,所以,可以把题目转换为:在一个数组中,有一个数字出现的次数超过了数组大小的一半,这和题目原意是一样的。      这道题目的思想是我们同时去掉数组中两个不一样的数字,那么...

Discuz X 发帖提交器一点实现

#!/usr/bin/python #coding=utf-8 #post by EvilBinary 小E 实现Discuz X 的post自动提交。 #Filename: post.py imp...

分享一个免费自动发帖软件,免费自动发布信息软件

分享一个免费自动发帖软件,免费自动发布信息软件 免费自动发布信息软件服务于个人,企业。只要您有产品或是有服务,只要您想在网络上遍布您的产品信息,那么选择免费自动发布信息软件吧。这正是我们的专业,专业针...

【编程之美】读书笔记:寻找发帖水王

问题:传说,Tango有一大“水王”,他不但喜欢发帖还会回复其他ID发的每个帖子。该“水王”的帖子数目超过了帖子总数的一半,如何用快速的方法找出这个“水王”的ID?          分析:首先想到...

vb.net自动发帖器二(httpwebrequest实现)

vb.net自动发帖器二(httpwebrequest实现) www.MyException.Cn,网友分享于:2012-09-04 14:19:30   浏览:187次 0 ...

腾讯二面情况,9月份找工作的童鞋进 (转) + 求二叉树深度 + 寻找发帖王

说明:虽说题目是二面准备,其实更多的是我一面是所考到的知识。不管几面吧,反正都是有用且常考的知识。 简述TCP协议在数据传输过程中收发双方是如何保证数据包的可靠性的 答: (1)为了保证数据包的可靠传...

discuz源码研究—发帖

实现了浏览栏目列表和帖子列表之后,下面最重要的就是实现发帖功能,先看了看论坛网页版的html代码,提取出下面这些有用的代码: <meta charset="utf-8"

关于论坛发帖图片不显示之解决策略

近期有部分高校俱乐部同学反映,论坛出现“图片不显示问题”,鉴于同学偶尔的疏忽和对论坛不大熟悉,表示理解。以此贴为例:《CSDN总部之行---山东大学(威海)》跟大家交流分享一下:          ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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