【选择图片Jar】拨云见日-GalleryAdapter完整代码(四)

1.开篇

经过前面(二)(三)两篇文章的基础,现在终于迎来激动人心的时刻啦!!拨云见日-GalleryAdapter的完整代码!

2.构造方法

首先我们看看他的构造方法和成员变量

public class GalleryAdapter extends BaseAdapter {
    // 路径集合
    private List<String> mPaths;
    // 上下文
    private Context mContext;
    // 选中状态管理器
    private SparseBooleanArray mSparseManager;
    // 右上角脚标的图片id
    private int mSelectedIcon, mUnSelectedIcon;
    // 选中状态的ColorFilter颜色代码
    private int mSelectedColor, mUnSelectedColor;

    public GalleryAdapter(Context context, List<String> list, int selectedIcon,
            int unselectedIcon) {
        this.mPaths = list;
        this.mContext = context;
        mSparseManager = new SparseBooleanArray();
        mSelectedIcon = selectedIcon;
        mUnSelectedIcon = unselectedIcon;
        mSelectedColor = Color.parseColor("#77000000");
        mUnSelectedColor = Color.parseColor("#00000000");
    }
}

需要解释的是这两个mSelectedIcon 和mUnSelectedIcon。在第一篇文章说了,我们不能够将资源文件打包进入jar,所以这里需要让项目传入两个id,一个选中状态图片的id一个是未选中状态图片的id。
具体指的是,右上角的那两个图标~
1.选中状态:
这里写图片描述
2.未选中状态:
这里写图片描述

3.核心方法getView()

像继承于BaseAdapter的另外三个方法就不说啦,我们来看看核心的getView()方法中的处理。代码!代码!我们来看看代码!

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = new ChosePhotoItemLayout(mContext);
            viewHolder.show =((ChosePhotoItemLayout)convertView)
                            .getShowImageView();
            viewHolder.select = ((ChosePhotoItemLayout) convertView).getSelectImageView();

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        //当前图片的path
        String path = mPaths.get(position);

        //设置ShowImageView的tag
        viewHolder.show.setTag(path);
        ImageLoaderWrapper.loadFromFile(viewHolder.show, path);
        //设置SelectImageView的tag
        viewHolder.select.setTag(path + "select");
        // 处理滑动错位
        handleScrollBackgroundChange(position, viewHolder.show,
                viewHolder.select);

        return convertView;
    }

大体上没有什么特别的。还是老套路创建一个ViewHolder然后进行控件缓存等等。

convertView = new ChosePhotoItemLayout(mContext);

viewHolder.show =((ChosePhotoItemLayout)convertView)
                .getShowImageView();

viewHolder.select = ((ChosePhotoItemLayout)convertView).getSelectImageView();

这段代码看不懂的 可以回顾一下上一篇文章【选择图片Jar】Adapter的item布局的实现(三)

OK!下面我们来看看这次比较重要的两段代码:

//设置ShowImageView的tag
viewHolder.show.setTag(path);

以及

//设置SelectImageView的tag
viewHolder.select.setTag(path + "select");

这两段代码为后面的点击事件做铺垫的~如果不明白这个是什么作用的可以理解成和findViewById一样,我们为每个控件做了唯一的标识。

方便我们处理GridView的点击事件~然后更改相应的点击状态。

// 处理滑动错位
handleScrollBackgroundChange(position, viewHolder.show,
                viewHolder.select);

这段代码看不懂的可以回顾一下第二篇文章【选择图片Jar】Adapter的实现之SparseBooleanArray图片状态管理器(二)

OK!至此 核心的方法getView()已经分析完毕

4.其他两个方法

    /**
    * 对外暴露图片管理器
    */
    public SparseBooleanArray getSparseBooleanArray() {
        return mSparseManager;
    }

    /**
    * 更新Adpter数据的方法
    */
    public void update(List<String> list) {
        mPaths = list;
        mSparseManager.clear();//特别注意清除所有保存的状态
        this.notifyDataSetChanged();
    }

相信这两个方法也非常好理解~!!

5.GalleryAdapter完整代码

OK!经过几篇文章的铺垫的描述,相信GalleryAdapter完整代码已经在各位的心中浮出水面了~ 下面贴上完整代码

public class GalleryAdapter extends BaseAdapter {
    // 路径集合
    private List<String> mPaths;
    // 上下文
    private Context mContext;
    // 选中状态管理器
    private SparseBooleanArray mSparseManager;
    // 右上角脚标的图片id
    private int mSelectedIcon, mUnSelectedIcon;
    // 选中状态的ColorFilter颜色代码
    private int mSelectedColor, mUnSelectedColor;

    public GalleryAdapter(Context context, List<String> list, int selectedIcon,
            int unselectedIcon) {
        this.mPaths = list;
        this.mContext = context;
        mSparseManager = new SparseBooleanArray();
        mSelectedIcon = selectedIcon;
        mUnSelectedIcon = unselectedIcon;
        mSelectedColor = Color.parseColor("#77000000");
        mUnSelectedColor = Color.parseColor("#00000000");
    }

    @Override
    public int getCount() {
        return mPaths.size();
    }

    @Override
    public Object getItem(int position) {
        return mPaths.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            // convertView = mLayoutInflater.inflate(R.layout.item_grid, parent,
            // false);
            // viewHolder.show = (ImageView) convertView
            // .findViewById(R.id.grid_iv_pic);
            // viewHolder.select = (ImageView) convertView
            // .findViewById(R.id.grid_iv_button);
            convertView = new ChosePhotoItemLayout(mContext);
            viewHolder.show = ((ChosePhotoItemLayout) convertView)
                    .getShowImageView();
            viewHolder.select = ((ChosePhotoItemLayout) convertView)
                    .getSelectImageView();
            convertView.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        // if (position == 0) {
        // ImageLoader.getInstance().displayImage("drawable://" + mIconId,
        // viewHolder.mIv_pic);
        // // 隐藏右上角图标
        // viewHolder.mIv_chose.setImageDrawable(new BitmapDrawable());
        // } else {
        String path = mPaths.get(position);

        // 设置ShowImageView的tag
        viewHolder.show.setTag(path);
        ImageLoaderWrapper.loadFromFile(viewHolder.show, path);
        // ImageLoader.getInstance().displayImage("file:///" + mPath,
        // viewHolder.show);
        // }

        // 设置SelectImageView的tag
        viewHolder.select.setTag(path + "select");
        // 处理滑动错位
        handleScrollBackgroundChange(position, viewHolder.show,
                viewHolder.select);
        return convertView;
    }

    /**
     * 对外暴露图片管理器
     */
    public SparseBooleanArray getSparseBooleanArray() {
        return mSparseManager;
    }

    /**
     * 主要用来在选中操作时候,处理滑动错位的图片显示问题
     */
    private void handleScrollBackgroundChange(int position, ImageView show,
            ImageView select) {
        int selectBtnBackground;
        int colorFilter;
        // if (position != 0) {
        if (isItemChecked(position)) {
            selectBtnBackground = mSelectedIcon;
            colorFilter = mSelectedColor;
        } else {
            selectBtnBackground = mUnSelectedIcon;
            colorFilter = mUnSelectedColor;
        }
        show.setColorFilter(colorFilter);
        // ImageLoader.getInstance().displayImage(
        // "drawable://" + selectBtnBackground, select);
        ImageLoaderWrapper.loadFromDrawable(select, selectBtnBackground);
        // } else {

        // }
    }

    private boolean isItemChecked(int position) {
        if (mSparseManager != null) {
            return mSparseManager.get(position);
        }
        return false;
    }

    /**
     * 更新Adpter数据的方法
     */
    public void update(List<String> list) {
        mPaths = list;
        mSparseManager.clear();// 特别注意清除所有保存的状态
        this.notifyDataSetChanged();
    }

    private class ViewHolder {
        ImageView show;
        ImageView select;
    }
}

6.附上ImageLoaderWrapper的代码

public class ImageLoaderWrapper {

    public static void loadFromFile(ImageView view, String 
    path) {
        ImageLoader.getInstance().displayImage("file:///" + path, view);
    }

    public static void loadFromDrawable(ImageView view, int drawableId) {
        ImageLoader.getInstance()
                .displayImage("drawable://" + drawableId, view);
    }
}

非常简单的代码。 是第三方库的UniversalImageLoader的包装。
UniversalImageLoader Github

7.结束语

至此,完整的GalleryAdapter已经完毕了~希望还是要勤打代码,巩固知识! 代码是最好的老师!

下面文章将讲解具体:
GalleryAdapter通过GalleryGridViewController实现与GalleryGridView的逻辑

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值