package com.cellasoft.univrapp.adapter;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import com.cellasoft.univrapp.model.Item;
import com.cellasoft.univrapp.utils.ActiveList;
import com.cellasoft.univrapp.utils.Lists;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.imageaware.ImageAware;
import com.nostra13.universalimageloader.core.imageaware.ImageViewAware;
import java.lang.ref.WeakReference;
import java.util.Collection;
import java.util.List;
public abstract class BaseListAdapter<T> extends ArrayAdapter<T> {
private static final int REFRESH_MESSAGE = 1;
protected LayoutInflater mInflater;
protected int resource; // store the resource layout id for 1 row
protected List<T> items;
protected IncomingHandler handler = new IncomingHandler(this);
protected ImageLoader imageLoader;
protected ActiveList.ActiveListListener<Item> activeListListener = new ActiveList.ActiveListListener<Item>() {
@Override
public void onAdd(Item item) {
refresh();
}
@Override
public void onInsert(final int location, final Item item) {
refresh();
}
@Override
public void onClear() {
refresh();
}
@Override
public void onAddAll(Collection<? extends Item> items) {
refresh();
}
};
public BaseListAdapter(Context context, int resource) {
super(context, resource);
this.resource = resource;
this.items = Lists.newArrayList();
this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Get singleton instance of ImageLoader
this.imageLoader = ImageLoader.getInstance();
}
public BaseListAdapter(Context context, int resource, List<T> items) {
super(context, resource, items);
this.resource = resource;
this.items = items;
}
@Override
public int getCount() {
return items.size();
}
@Override
public T getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
protected abstract void populateDataForRow(ViewHolder holder, T item, int position);
@Override
public abstract View getView(int position, View convertView, ViewGroup parent);
protected void imageLoader(ViewHolder holder, String imageUrl) {
if (!holder.isSameView(imageUrl)) {
holder.thumbnail.setTag(imageUrl);
ImageAware imageAware = new ImageViewAware(holder.thumbnail, false);
imageLoader.displayImage(imageUrl, imageAware);
}
}
public synchronized void addItems(List<T> items) {
if (this.items != null) {
this.items.addAll(items);
} else {
this.items = Lists.newArrayList();
this.items.addAll(items);
}
refresh();
}
public synchronized void addItemsOnTop(List<T> items) {
if (this.items != null) {
this.items.addAll(0, items);
refresh();
} else {
addItems(items);
}
}
public synchronized void refresh() {
handler.sendEmptyMessage(REFRESH_MESSAGE);
}
public synchronized List<T> getItems() {
return items;
}
public synchronized void setItems(List<T> items) {
this.items = items;
refresh();
}
@Override
public synchronized void clear() {
items.clear();
refresh();
}
static class IncomingHandler extends Handler {
private final WeakReference<BaseListAdapter<?>> mAdapter;
IncomingHandler(BaseListAdapter<?> adapter) {
this.mAdapter = new WeakReference<BaseListAdapter<?>>(adapter);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
BaseListAdapter<?> adapter = mAdapter.get();
if (adapter != null && msg.what == REFRESH_MESSAGE) {
adapter.notifyDataSetChanged();
}
}
}
class ViewHolder {
int position;
ImageView thumbnail;
public boolean isSameView(String tag) {
if (tag == null) {
return thumbnail.getTag() == null;
}
return tag.equals(thumbnail.getTag());
}
}
}