package in.srain.cube.views.list;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import in.srain.cube.util.CLog;
import in.srain.cube.util.CubeDebug;
/**
* A adapter using View Holder to display the item of a list view;
*
* @param <ItemDataType>
* @author http://www.liaohuqiu.net
*/
public abstract class ListViewDataAdapterBase<ItemDataType> extends BaseAdapter {
private static final String LOG_TAG = "cube-list";
protected ViewHolderCreator<ItemDataType> mViewHolderCreator;
protected ViewHolderCreator<ItemDataType> mLazyCreator;
protected boolean mForceCreateView = false;
public ListViewDataAdapterBase() {
}
public ListViewDataAdapterBase(final Object enclosingInstance, final Class<?> cls) {
setViewHolderClass(enclosingInstance, cls);
}
/**
* @param viewHolderCreator The view holder creator will create a View Holder that extends {@link in.srain.cube.views.list.ViewHolderBase}
*/
public ListViewDataAdapterBase(ViewHolderCreator<ItemDataType> viewHolderCreator) {
mViewHolderCreator = viewHolderCreator;
}
public void setViewHolderCreator(ViewHolderCreator<ItemDataType> viewHolderCreator) {
mViewHolderCreator = viewHolderCreator;
}
public void setViewHolderClass(final Object enclosingInstance, final Class<?> cls, final Object... args) {
mLazyCreator = LazyViewHolderCreator.create(enclosingInstance, cls, args);
}
private ViewHolderBase<ItemDataType> createViewHolder(int position) {
if (mViewHolderCreator == null && mLazyCreator == null) {
throw new RuntimeException("view holder creator is null");
}
if (mViewHolderCreator != null) {
return mViewHolderCreator.createViewHolder(position);
}
if (mLazyCreator != null) {
return mLazyCreator.createViewHolder(position);
}
return null;
}
public void forceCreateView(boolean yes) {
mForceCreateView = yes;
}
@SuppressWarnings("unchecked")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (CubeDebug.DEBUG_LIST) {
CLog.d(LOG_TAG, "getView %s", position);
}
ItemDataType itemData = getItem(position);
ViewHolderBase<ItemDataType> holderBase = null;
if (mForceCreateView || convertView == null || (!(convertView.getTag() instanceof ViewHolderBase<?>))) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
holderBase = createViewHolder(position);
if (holderBase != null) {
convertView = holderBase.createView(inflater);
if (convertView != null) {
if (!mForceCreateView) {
convertView.setTag(holderBase);
}
}
}
} else {
holderBase = (ViewHolderBase<ItemDataType>) convertView.getTag();
}
if (holderBase != null) {
holderBase.setItemData(position, convertView);
holderBase.showData(position, itemData);
}
return convertView;
}
@Override
public abstract ItemDataType getItem(int position);
}