package com.ywwxhz.adapters; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import com.nostra13.universalimageloader.core.process.BitmapProcessor; import com.ywwxhz.cnbetareader.R; import com.ywwxhz.entitys.NewsItem; import com.ywwxhz.hoderview.NewsListItemHoderView; import com.ywwxhz.lib.ThemeManger; import com.ywwxhz.lib.kits.PrefKit; import com.ywwxhz.lib.kits.UIKit; import java.util.Collections; import java.util.LinkedList; import java.util.List; /** * cnBetaReader * * Created by 远望の无限(ywwxhz) on 2014/11/1 17:53. */ public class NewsListAdapter extends BaseAdapter<NewsItem> { private static final String TAG = NewsListAdapter.class.getSimpleName(); private boolean showLarge; private boolean showImage; private DisplayImageOptions optionsLarge; private DisplayImageOptions optionsSmall; private NightBitmapProcessor bitmapProcessor; private AnimateFirstDisplayListener listener = new AnimateFirstDisplayListener(); public NewsListAdapter(Context context, List<NewsItem> items) { super(context, items); bitmapProcessor = new NightBitmapProcessor(); showLarge = PrefKit.getBoolean(context, context.getString(R.string.pref_show_large_image_key), false); showImage = PrefKit.getBoolean(context, context.getString(R.string.pref_show_list_news_image_key), true); optionsLarge = new DisplayImageOptions.Builder() .cacheInMemory(true) .cacheOnDisk(true) .showImageOnLoading(R.drawable.imagehoder) .showImageOnFail(R.drawable.imagehoder_error) .preProcessor(bitmapProcessor) .displayer(new SimpleBitmapDisplayer()).build(); optionsSmall = new DisplayImageOptions.Builder() .cacheInMemory(true) .cacheOnDisk(true) .showImageOnLoading(R.drawable.imagehoder_sm) .showImageOnFail(R.drawable.imagehoder_error_sm) .preProcessor(bitmapProcessor) .displayer(new RoundedBitmapDisplayer(UIKit.dip2px(context,10))).build(); bitmapProcessor.setEnable(ThemeManger.isNightTheme(context)); } @Override protected View bindViewAndData(LayoutInflater infater, int position, View convertView, ViewGroup parent) { NewsListItemHoderView view = (NewsListItemHoderView) convertView; if (view == null) { view = (NewsListItemHoderView) infater.inflate(R.layout.news_list_item,parent,false); } NewsItem item = getDataSetItem(position); view.showNews(item, showImage, showLarge, optionsLarge, optionsSmall, listener); return view; } @Override public void notifyDataSetChanged(boolean changeConfig) { if(changeConfig){ showLarge = PrefKit.getBoolean(context, context.getString(R.string.pref_show_large_image_key), false); showImage = PrefKit.getBoolean(context, context.getString(R.string.pref_show_list_news_image_key), true); bitmapProcessor.setEnable(ThemeManger.isNightTheme(context)); } super.notifyDataSetChanged(); } public static class AnimateFirstDisplayListener extends SimpleImageLoadingListener { static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>()); @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { if (loadedImage != null) { ImageView imageView = (ImageView) view; boolean firstDisplay = !displayedImages.contains(imageUri); if (firstDisplay && imageView.getVisibility() == View.VISIBLE) { FadeInBitmapDisplayer.animate(imageView, 500); displayedImages.add(imageUri); } } } } class NightBitmapProcessor implements BitmapProcessor{ private boolean enable = false; private PorterDuffXfermode mode; public NightBitmapProcessor() { mode = new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP); } @Override public Bitmap process(Bitmap bitmap) { if(enable) { final Paint paint = new Paint(); paint.setAntiAlias(true); Bitmap target = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(target); canvas.drawBitmap(bitmap, 0, 0, paint); paint.setXfermode(mode); canvas.drawARGB(70, 0, 0, 0); bitmap.recycle(); return target; }else{ return bitmap; } } public void setEnable(Boolean enable){ this.enable = enable; } } }