今天項目需求碰到了一個問題炫惩,廢話不多說了上圖僻弹,如下點擊右邊ImageView動態(tài)去切換ImageView的狀態(tài),代碼如下:
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消失再重新加載才會根據(jù)map中boolean值來設(shè)置圖片前景(忘了notifyDataSetChanged();了)他嚷,查看setImageResource()源碼
翻譯:這個方法是在UI線程中對圖片讀取和解析的,所以有可能對一個Activity的啟動造成延遲蹋绽。所以如果顧慮到這個官方建議用setImageDrawable和setImageBitmap來代替。所以我們使用setImageBitmap或者setImageDrawable來設(shè)置圖片筋蓖,來看源碼解析
@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對象,然后調(diào)用setImageDrawable來設(shè)置圖片卸耘。因此代碼里面才寫上了建議,如果需要頻繁調(diào)用這個方法的話最好自己封裝個固定的Drawable對象,直接調(diào)用setImageDrawable,這樣可以減少Drawable對象。因為每次調(diào)用setImageBitmap方法都會對Bitmap對象new出一個Drawable粘咖。
setImageDrawable參數(shù)是Drawable,也是可以接受不同來源的圖片,方法中所做的事情就是更新ImageView的圖片蚣抗。上面兩個方法實際上最后調(diào)用的都是setImageDrawable(setImageResource沒有直接調(diào)用,不過更新的方法與setImageDrawable一樣)。
所以綜合來看setImageDrawable是最省內(nèi)存高效的,如果擔(dān)心圖片過大或者圖片過多影響內(nèi)存和加載效率,可以自己解析圖片然后通過調(diào)用setImageDrawable方法進行設(shè)置瓮下。
好了以上小弟的真知灼見翰铡,只能寫這么些啦6塾颉!两蟀!