package cn.mutils.app.ui.adapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import java.lang.reflect.Constructor;
import java.util.List;
import cn.mutils.app.os.IContextProvider;
import cn.mutils.core.reflect.ReflectUtil;
/**
* Provide object-oriented item view
*/
@SuppressWarnings({"unchecked", "unused"})
public class ItemAdapter<DATA_ITEM> extends BaseAdapter implements IItemAdapter<DATA_ITEM> {
/**
* Container who hold item views
*/
protected ViewGroup mContainer;
/**
* Data provider for item views
*/
protected List<DATA_ITEM> mDataProvider;
/**
* Constructor for item views
*/
protected Constructor<? extends IItemView<DATA_ITEM>> mItemViewConstructor;
/**
* Set type for item views to create by reflection
*
* @see #getItemView(int)
*/
public void setItemViewClass(Class<? extends IItemView<DATA_ITEM>> itemViewClass) {
mItemViewConstructor = ReflectUtil.getConstructor(itemViewClass, Context.class);
}
/**
* Get context
*
* @return Return null if container is null
*/
public Context getContext() {
if (this.mContainer == null) {
return null;
}
return this.mContainer.getContext();
}
/**
* Get container
*
* @see #mContainer
*/
public ViewGroup getContainer() {
return this.mContainer;
}
/**
* Call back for container change
*/
protected void onContainerChanged() {
}
/**
* Get data provider for item views
*/
public List<DATA_ITEM> getDataProvider() {
return mDataProvider;
}
/**
* Set data provider for item views
*/
public void setDataProvider(List<DATA_ITEM> dataProvider) {
this.mDataProvider = dataProvider;
this.notifyDataSetChanged();
}
/**
* Get count of item views
*
* @return count of item views
*/
@Override
public int getCount() {
if (this.mDataProvider == null) {
return 0;
}
return this.mDataProvider.size();
}
/**
* Get item view data provider for index
*
* @return item view data provider
* @see IItemView#getDataProvider()
*/
@Override
public DATA_ITEM getItem(int position) {
if (this.mDataProvider == null) {
return null;
}
return this.mDataProvider.get(position);
}
/**
* Get item id
*/
@Override
public long getItemId(int position) {
return position;
}
/**
* Subclass need to override this method
*
* @see IItemView
*/
public IItemView<DATA_ITEM> getItemView(int itemViewType) {
if (mItemViewConstructor == null) {
return null;
}
return ReflectUtil.newInstance(mItemViewConstructor, getContext());
}
/**
* Object-orient item view creation and reuse
*
* @see BaseAdapter#getView(int, View, ViewGroup)
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (this.mContainer == null) {
this.mContainer = parent;
this.onContainerChanged();
}
IItemView<DATA_ITEM> itemView = (IItemView<DATA_ITEM>) convertView;
boolean isCreated = itemView != null;
if (!isCreated) {
itemView = this.getItemView(this.getItemViewType(position));
itemView.setAdapter(this);
}
itemView.setPosition(position);
itemView.setDataProvider(this.getItem(position));
if (!isCreated) {
itemView.onCreate();
}
itemView.onResume();
return itemView.toView();
}
}