lacolaco
6/15/2013 - 5:20 AM

ListViewに渡してるAdapterのコード。継承して使うけど

ListViewに渡してるAdapterのコード。継承して使うけど

package net.miz_hi.smileessence.util;

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public abstract class CustomListAdapter<T> extends BaseAdapter
{

//  private T[] array;
	private List<T> list;
	private final Object lock = new Object();
	private boolean canMotifyOnChange = true;
	private Activity activity;
	private LayoutInflater inflater;
	private int capacity;

	public CustomListAdapter(Activity activity, int capacity)
	{
		this.capacity = capacity;
		this.list = new LinkedList<T>();
		this.activity = activity;
		this.inflater = LayoutInflater.from(activity);
	}

	public void addAll(Collection<T> collection)
	{
		synchronized (lock)
		{
			for (T element : collection)
			{
				if (list.contains(element))
				{
					list.remove(element);
				}
				list.add(element);
				if (list.size() >= capacity)
				{
					break;
				}
			}
		}
	}

	public void addFirst(T element)
	{
		synchronized (lock)
		{
			if (list.contains(element))
			{
				list.remove(element);
			}
			list.add(0, element);

			if (list.size() >= capacity)
			{
				list.remove(list.size() - 1);
			}
			notifyAdapter();
		}
	}
	
	public void addLast(T element)
	{
		synchronized (lock)
		{
			if (list.contains(element))
			{
				list.remove(element);
			}
			list.add(element);
			notifyAdapter();
		}
	}

	public void removeElement(T element)
	{
		synchronized (lock)
		{
			list.remove(element);
			notifyAdapter();
		}
	}
	
	public void clear()
	{
		synchronized (lock)
		{
			list.clear();
			notifyAdapter();
		}
	}

	public void notifyAdapter()
	{
		if (canMotifyOnChange)
		{
			new UiHandler()
			{
				
				@Override
				public void run()
				{
					notifyDataSetChanged();
				}
			}.postAtFrontOfQueue();
		}
	}

	public void forceNotifyAdapter()
	{
		synchronized (lock)
		{
			new UiHandler()
			{
				@Override
				public void run()
				{
					notifyDataSetChanged();
				}
			}.post();
		}
	}

	public void setCanNotifyOnChange(boolean notifyOnChange)
	{
		synchronized (lock)
		{
			this.canMotifyOnChange = notifyOnChange;
		}
	}
	
	public boolean getCanNotifyOnChange()
	{
		synchronized (lock)
		{
			return canMotifyOnChange;
		}
	}

	public Activity getActivity()
	{
		return activity;
	}
	

	@Override
	public void notifyDataSetChanged()
	{
		synchronized (lock)
		{
			new UiHandler()
			{
				
				@Override
				public void run()
				{
					CustomListAdapter.super.notifyDataSetChanged();			
				}
			}.post();
		}
	}

	@Override
	public int getCount()
	{
		return list.size();
	}
	
	@Override
	public Object getItem(int position)
	{
		synchronized (lock)
		{
			return list.get(position);
		}
	}

	@Override
	public long getItemId(int position)
	{
		return position;
	}

	public LayoutInflater getInflater()
	{
		return inflater;
	}

	@Override
	public abstract View getView(int position, View convertedView, ViewGroup parent);

}