今天项目需求碰到了一个问题,废话不多说了上图,如下点击右边ImageView动态去切换ImageView的状态,代码如下:
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()源码
翻译:这个方法是在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方法进行设置。
好了以上小弟的真知灼见,只能写这么些啦!!!