关于ImageView图片点击切换前景图片实现CheckBox的功能

今天项目需求碰到了一个问题,废话不多说了上图,如下点击右边ImageView动态去切换ImageView的状态,代码如下:


关于ImageView图片点击切换前景图片实现CheckBox的功能_第1张图片

packagecom.silver.clound.adapter;

importandroid.app.Activity;

importandroid.content.Context;

importandroid.view.View;

importandroid.view.ViewGroup;

importandroid.widget.BaseAdapter;

importandroid.widget.ImageView;

importandroid.widget.TextView;

importcom.silver.clound.R;

importcom.silver.clound.model.SongsBean;

importjava.util.HashMap;

importjava.util.List;

/**

* Created by joe on 2017/3/6.

*/

public classMusicAdapterextendsBaseAdapter  {

privateContextcontext;

privateListlist;

//图片是否被选中

private booleanisChoice=false;

privateHashMapivMap=newHashMap<>();

publicMusicAdapter(Activity mActivity,List list) {

this.context= mActivity;

this.list= list;

for(inti =0;i < list.size();i++) {

ivMap.put(i,isChoice);

}

}

@Override

public intgetCount() {

returnlist.size();

}

@Override

publicObjectgetItem(inti) {

returnlist.get(i);

}

@Override

public longgetItemId(inti) {

returni;

}

privateViewHolderholder;

@Override

publicViewgetView(final inti,View view,ViewGroup viewGroup) {

if(view ==null) {

holder=newViewHolder();

//引入布局

view = View.inflate(context,R.layout.item_music_listview, null);

//实例化对象

holder.song= (TextView) view.findViewById(R.id.tv_song);

holder.singer= (TextView) view.findViewById(R.id.tv_singer);

holder.ivChoice= (ImageView) view.findViewById(R.id.iv_choice);

view.setTag(holder);

}else{

holder= (ViewHolder) view.getTag();

}

//给控件赋值

holder.song.setText(list.get(i).song.toString());

holder.singer.setText("("+list.get(i).singer.toString() +")");

holder.ivChoice.setImageResource(ivMap.get(i)?R.drawable.select_circle:R.drawable.ic_file_circle);

holder.ivChoice.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(View v) {

ivMap.put(i,!ivMap.get(i));

if(ivMap.get(i)) {

holder.ivChoice.setImageResource(ivMap.get(i)?R.drawable.select_circle:R.drawable.ic_file_circle);

notifyDataSetChanged();

}

}

});

returnview;

}

classViewHolder {

TextViewsong;//歌曲名

TextViewsinger;//歌手

ImageViewivChoice;//选中与否的图片

}

}

点击事件无论如何都没办法立刻去切换ImageView的前景图片只有滑动到item消失再重新加载才会根据map中boolean值来设置图片前景(忘了notifyDataSetChanged();了),查看setImageResource()源码


关于ImageView图片点击切换前景图片实现CheckBox的功能_第2张图片

翻译:这个方法是在UI线程中对图片读取和解析的,所以有可能对一个Activity的启动造成延迟。所以如果顾虑到这个官方建议用setImageDrawable和setImageBitmap来代替。所以我们使用setImageBitmap或者setImageDrawable来设置图片,来看源码解析


@android.view.RemotableViewMethod

public void setImageBitmap(Bitmap bm) {

// if this is used frequently, mayhandle bitmaps explicitly

// to reduce the intermediate drawable object

setImageDrawable(newBitmapDrawable(mContext.getResources(), bm));

}

实际上setImageBitmap做的事情就是把Bitmap对象封装成Drawable对象,然后调用setImageDrawable来设置图片。因此代码里面才写上了建议,如果需要频繁调用这个方法的话最好自己封装个固定的Drawable对象,直接调用setImageDrawable,这样可以减少Drawable对象。因为每次调用setImageBitmap方法都会对Bitmap对象new出一个Drawable。

setImageDrawable参数是Drawable,也是可以接受不同来源的图片,方法中所做的事情就是更新ImageView的图片。上面两个方法实际上最后调用的都是setImageDrawable(setImageResource没有直接调用,不过更新的方法与setImageDrawable一样)。

所以综合来看setImageDrawable是最省内存高效的,如果担心图片过大或者图片过多影响内存和加载效率,可以自己解析图片然后通过调用setImageDrawable方法进行设置。

好了以上小弟的真知灼见,只能写这么些啦!!!

你可能感兴趣的:(关于ImageView图片点击切换前景图片实现CheckBox的功能)