package com.cundong.izhihu.adapter; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Color; import android.preference.PreferenceManager; import android.util.SparseBooleanArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.cundong.izhihu.R; import com.cundong.izhihu.entity.NewsListEntity.NewsEntity; import com.cundong.izhihu.util.ListUtils; import com.cundong.izhihu.util.NetWorkHelper; import com.cundong.izhihu.util.ZhihuUtils; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; /** * 类说明: 新闻列表 Adapter * * @date 2014-9-7 * @version 1.0 */ public class NewsAdapter extends MultiViewTypeBaseAdapter<NewsEntity> { // 带图item private static final int TYPE_0 = 0; // 不带图item private static final int TYPE_1 = 1; // tag private static final int TYPE_2 = 2; private ImageLoader mImageLoader = ImageLoader.getInstance(); private ImageLoadingListener mAnimateFirstListener = new AnimateFirstDisplayListener(); private int titleColorNorId, titleReadColorId, listItemDefaultImageId; // 是否当前为收藏夹Adapter private boolean mFavoriteFalg = false; private DisplayImageOptions mOptions = null; private SparseBooleanArray mSelectedItemsIds = null; public NewsAdapter(Context context, ArrayList<NewsEntity> list) { super(context, list); this.mSelectedItemsIds = new SparseBooleanArray(); initStyle(); } private void initStyle() { Resources.Theme theme = mContext.getTheme(); TypedArray typedArray = null; SharedPreferences mPerferences = PreferenceManager.getDefaultSharedPreferences(mContext); if (mPerferences.getBoolean("dark_theme?", false)) { typedArray = theme.obtainStyledAttributes(R.style.Theme_Daily_AppTheme_Dark, new int[] { R.attr.listItemTextNorColor, R.attr.listItemTextReadColor, R.attr.listItemDefaultImage }); } else { typedArray = theme.obtainStyledAttributes(R.style.Theme_Daily_AppTheme_Light, new int[] { R.attr.listItemTextNorColor, R.attr.listItemTextReadColor, R.attr.listItemDefaultImage }); } titleColorNorId = typedArray.getResourceId(0, 0); titleReadColorId = typedArray.getResourceId(1, 0); listItemDefaultImageId = typedArray.getResourceId(2, 0); typedArray.recycle(); mOptions = new DisplayImageOptions.Builder().showImageOnLoading(mContext.getResources().getDrawable(listItemDefaultImageId)).showImageOnFail(mContext.getResources().getDrawable(listItemDefaultImageId)).showImageForEmptyUri(mContext.getResources().getDrawable(listItemDefaultImageId)).cacheInMemory(true).cacheOnDisk(true).considerExifParams(true).build(); } public void setFavoriteFlag(boolean favoriteFalg) { this.mFavoriteFalg = favoriteFalg; } public void toggleSelection(int position) { selectView(position, !mSelectedItemsIds.get(position)); } public void selectView(int position, boolean noSelect) { if (noSelect) mSelectedItemsIds.put(position, true); else mSelectedItemsIds.delete(position); notifyDataSetChanged(); } public void clearSelection() { mSelectedItemsIds = new SparseBooleanArray(); notifyDataSetChanged(); } public int getSelectedCount() { return mSelectedItemsIds.size(); } public SparseBooleanArray getSelectedIds() { return mSelectedItemsIds; } @Override public int getViewTypeCount() { if (mFavoriteFalg) { return 2; } else { return 3; } } @Override public int getItemViewType(int position) { NewsEntity newsEntity = mDataList.get(position); if (newsEntity.isTag) { return TYPE_2; } else { if (NetWorkHelper.isMobile(mContext) && PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean("noimage_nowifi?", false)) { return TYPE_1; } else { if (!ListUtils.isEmpty(newsEntity.images)) { return TYPE_0; } else { return TYPE_1; } } } } @Override public int getItemResourceId(int type) { switch (type) { case TYPE_0: return R.layout.list_item; case TYPE_1: return R.layout.list_item_no_image; case TYPE_2: default: return R.layout.list_date_item; } } @SuppressWarnings("unchecked") @Override public View getView(int position, View convertView, ViewGroup parent) { int type = getItemViewType(position); ViewHolder holder0 = null; ViewHolder holder1 = null; ViewHolder holder2 = null; switch (type) { case TYPE_0: { if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(getItemResourceId(type), parent, false); holder0 = new ViewHolder(convertView); convertView.setTag(holder0); } else { holder0 = (ViewHolder) convertView.getTag(); } return getItemView(position, convertView, holder0, type); } case TYPE_1: { if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(getItemResourceId(type), parent, false); holder1 = new ViewHolder(convertView); convertView.setTag(holder1); } else { holder1 = (ViewHolder) convertView.getTag(); } return getItemView(position, convertView, holder1, type); } case TYPE_2: { if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(getItemResourceId(type), parent, false); holder2 = new ViewHolder(convertView); convertView.setTag(holder2); } else { holder2 = (ViewHolder) convertView.getTag(); } return getItemView(position, convertView, holder2, type); } } return null; } @Override public View getItemView(int position, View convertView, ViewHolder holder, int type) { final NewsEntity newsEntity = mDataList.get(position); switch (type) { case TYPE_0: { ImageView newsImageView = (ImageView) holder.getView(R.id.list_item_image); TextView newsTitleView = (TextView) holder.getView(R.id.list_item_title); newsTitleView.setText(newsEntity.title); if (mFavoriteFalg) { } else { newsTitleView.setTextColor(newsEntity.is_read ? mContext.getResources().getColor(titleReadColorId) : mContext.getResources().getColor(titleColorNorId)); } newsImageView.setVisibility(View.VISIBLE); mImageLoader.displayImage(newsEntity.images.get(0), newsImageView, mOptions, mAnimateFirstListener); convertView.setBackgroundColor(mSelectedItemsIds.get(position) ? mContext.getResources().getColor(R.color.listview_multi_sel_bg) : Color.TRANSPARENT); break; } case TYPE_1: { TextView newsTitleView = (TextView) holder.getView(R.id.list_item_title); newsTitleView.setText(newsEntity.title); if (mFavoriteFalg) { } else { newsTitleView.setTextColor(newsEntity.is_read ? mContext.getResources().getColor(titleReadColorId) : mContext.getResources().getColor(titleColorNorId)); } convertView.setBackgroundColor(mSelectedItemsIds.get(position) ? mContext.getResources().getColor(R.color.listview_multi_sel_bg) : Color.TRANSPARENT); break; } case TYPE_2: { TextView dateView = (TextView) holder.getView(R.id.date_text); dateView.setText(ZhihuUtils.getDateTag(mContext, newsEntity.title)); break; } } return convertView; } private 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) { FadeInBitmapDisplayer.animate(imageView, 500); displayedImages.add(imageUri); } } } } }