package com.roboo.like.google.adapters;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.AsyncTask;
import android.support.v4.util.LruCache;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.roboo.like.google.PictureDetailActivity;
import com.roboo.like.google.R;
import com.roboo.like.google.listener.ImageLoadingListenerImpl;
import com.roboo.like.google.models.PictureItem;
import com.roboo.like.google.staggeredgrid.StaggeredGridView;
import com.roboo.like.google.utils.BitmapUtils;
public class StickyGridAdapter extends BaseAdapter implements StickyHeadersAdapter
{
private static final boolean DEBUG = true;
private List<PictureItem> hasHeaderIdList;
private LayoutInflater mInflater;
private Activity mActivity;
/**
* 记录所有正在下载或等待下载的任务。
*/
private Set<BitmapWorkerTask> taskCollection = new HashSet<BitmapWorkerTask>();
private int mFirstVisibleItem;
private int mVisibleItemCount;
private ImageLoader mImageLoader;
// 获取应用程序的最大内存
final int maxMemory = (int) (Runtime.getRuntime().maxMemory());
private LruCache<String, Bitmap> mLruCache = new LruCache<String, Bitmap>(maxMemory / 8)
{
protected int sizeOf(String key, Bitmap bitmap)
{
return bitmap.getRowBytes() * bitmap.getHeight();
};
};
public StickyGridAdapter(Activity activity, List<PictureItem> hasHeaderIdList)
{
this.mActivity = activity;
mInflater = LayoutInflater.from(mActivity);
this.hasHeaderIdList = hasHeaderIdList;
mImageLoader = ImageLoader.getInstance();
ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(mActivity);
if (!mImageLoader.isInited())
{
mImageLoader.init(configuration);
}
}
public int getCount()
{
return hasHeaderIdList.size();
}
public Object getItem(int position)
{
return hasHeaderIdList.get(position);
}
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.picture_grid_item, parent, false);
if (parent instanceof StaggeredGridView)
{
convertView = mInflater.inflate(R.layout.picture_pin_item, parent, false);
}
}
final ImageView imageView = (ImageView) convertView.findViewById(R.id.iv_image);
String path = hasHeaderIdList.get(position).getPath();
// if (mLruCache.get(path) == null)
// {
// new BitmapWorkerTask(imageView).execute(path);
// }
// else
// {
// imageView.setImageBitmap(mLruCache.get(path));
// }
DisplayImageOptions options = new DisplayImageOptions.Builder().imageScaleType(ImageScaleType.EXACTLY_STRETCHED).showStubImage(R.drawable.ic_default_image).showImageForEmptyUri(R.drawable.ic_default_image).bitmapConfig(Config.RGB_565).build();
mImageLoader.displayImage("file://" + path, imageView, options );
// mImageLoader.displayImage("file://" + path, imageView, new ImageLoadingListenerImpl());
imageView.setOnClickListener(new OnClickListenerImpl(path));
return convertView;
}
public View getHeaderView(int position, View convertView, ViewGroup parent)
{
convertView = mInflater.inflate(R.layout.sticky_header_view, parent, false);
TextView textView = (TextView) convertView.findViewById(R.id.tv_text);
textView.setText(hasHeaderIdList.get(position).getTime());
return convertView;
}
/**
* 获取HeaderId, 只要HeaderId不相等就添加一个Header
*/
public long getHeaderId(int position)
{
return hasHeaderIdList.get(position).getHeaderId();
}
/**
* 异步下载图片的任务。
*/
class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap>
{
private ImageView mImageView;
private String imagePath;
@Override
protected void onPreExecute()
{
taskCollection.add(this);
super.onPreExecute();
}
public BitmapWorkerTask(ImageView mImageView)
{
super();
this.mImageView = mImageView;
}
protected Bitmap doInBackground(String... params)
{
imagePath = params[0];
return BitmapUtils.getBitmap(imagePath);
}
@Override
protected void onPostExecute(Bitmap bitmap)
{
taskCollection.remove(this);
if (null != imagePath && null != bitmap)
{
mImageView.setImageBitmap(bitmap);
mLruCache.put(imagePath, bitmap);
}
}
}
private class OnScrollListenerImpl implements OnScrollListener
{
public void onScrollStateChanged(AbsListView view, int scrollState)
{
// 仅当GridView静止时才去下载图片,GridView滑动时取消所有正在下载的任务
if (scrollState == SCROLL_STATE_IDLE)
{
showImageWhenIDLE(view, mFirstVisibleItem, mVisibleItemCount);
}
else
{
cancelAllTasks();
}
}
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount)
{
mFirstVisibleItem = firstVisibleItem;
mVisibleItemCount = visibleItemCount;
}
}
private void showImageWhenIDLE(AbsListView view, int firstVisibleItem, int visibleItemCount)
{
for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++)
{
PictureItem item = hasHeaderIdList.get(i);
String imagePath = item.getPath();
Bitmap bitmap = mLruCache.get(imagePath);
ImageView imageView = (ImageView) view.findViewWithTag(imagePath);
if (bitmap != null)
{
imageView.setImageBitmap(bitmap);
}
else
{
new BitmapWorkerTask(imageView).execute(imagePath);
}
}
}
/**
* 取消所有正在下载或等待下载的任务。
*/
public void cancelAllTasks()
{
if (taskCollection != null)
{
for (BitmapWorkerTask task : taskCollection)
{
task.cancel(false);
}
}
}
private class OnClickListenerImpl implements OnClickListener
{
String imagePath;
public OnClickListenerImpl(String imagePath)
{
this.imagePath = imagePath;
}
public void onClick(View v)
{
PictureDetailActivity.actionPictureDetail(mActivity, imagePath);
}
}
}