provider作为UI展示和底层数据模型绑定
首先建立顶层ItemProvider:
public interface ContainerItemProvider<T extends Parcelable> {
public View newView(Context var1, ViewGroup var2);
public void bindView(View var1, int var2, T var3);
public interface SampleItemProvider<T extends Parcelable> extends YSContainerItemProvider<YSDayEventEntity> {
}
}
SampleItemProvider既根据视图所需求的功能自定义,其中newView作为初始化视图,绑定当前视图Holder,bindView绘制视图,下面是实例:
public class SampleTodayItemMainProvider implements ContainerItemProvider.SampleItemProvider<SampleEntity> {
@Override
public View newView(Context context, ViewGroup var2) {
View view = LayoutInflater.from(context).inflate(R.layout.cell_listview_today_main, (ViewGroup) null);
YSHeartTodayItemMainProvider.ViewHolder holder = new YSHeartTodayItemMainProvider.ViewHolder();
holder.img_bg = (ImageView) view.findViewById(R.id.img_today_main_bg);
holder.txt_title = (TextView) view.findViewById(R.id.tv_today_main_title);
holder.txt_content = (TextView) view.findViewById(R.id.tv_today_main_content);
view.setTag(holder);
return view;
}
@Override
public void bindView(View view, int position, YSDayEventEntity dataEvent) {
YSHeartTodayItemMainProvider.ViewHolder holder = (YSHeartTodayItemMainProvider.ViewHolder) view.getTag();
//显示图片
if (ViewUtil.shouldRedraw(holder.img_bg, dataEvent.thumb)) {
holder.img_bg.setTag(dataEvent.thumb);
ImageLoader.getInstance().displayImage(dataEvent.thumb + CommonConstant.PICTURE_360, new ImageLoaderViewAware(holder.img_bg),
new YSImageLoadingListener(200));
}
//显示内容
if (ViewUtil.shouldRedraw(holder.txt_content, dataEvent.hashCode() + dataEvent.title)) {
holder.txt_content.setTag(dataEvent.hashCode() + dataEvent.title);
holder.txt_content.setText(dataEvent.title);
}
//显示标题
if (ViewUtil.shouldRedraw(holder.txt_title, dataEvent.hashCode() + dataEvent.badge)) {
holder.txt_title.setTag(dataEvent.hashCode() + dataEvent.badge);
holder.txt_title.setText(dataEvent.badge);
}
}
class ViewHolder {
private ImageView img_bg;
private TextView txt_title;
private TextView txt_content;
}
}
如需指定传入bindview的数据,SampleEntity既是底层数据模型,实体持有SampleTodayItemMainProvider,在绘制视图时可直接通过entity获取需要绘制的视图。下面是adapter中的代码:
public class SampleTodayItemLiteAdapter extends ObjectAdapter {
public SampleTodayItemLiteAdapter(Context context, YSOnListListener callback) {
super(context, callback);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.cell_listview_today, null);
holder = initViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//设置Value
setHolderValue(holder, convertView, position, (YSDayEventEntity) datas.get(position));
return convertView;
}
/* 初始化holder */
private ViewHolder initViewHolder(View convertView) {
ViewHolder holder = new ViewHolder();
holder.provider = (YSProviderContainerView) convertView.findViewById(R.id.provider_today_item);
return holder;
}
/* 设置Value的值 */
private void setHolderValue(ViewHolder holder, View convertView, int position, YSDayEventEntity dayEventEntity) {
YSContainerItemProvider.YSHeartTodayItemProvider provider = dayEventEntity.getDayEventUiProvider();
View view = null;
//展示ui
if (provider != null) {
view = holder.provider.inflate(provider);
provider.bindView(view, position, dayEventEntity);
}
}
class ViewHolder {
private YSProviderContainerView provider;
}
}
在adapter中可直接通过entity获取provider类型展示在视图上,adapter中的布局文件需要加入自定义的providerView,providerView的相关代码如下:
public class YSProviderContainerView extends FrameLayout {
private Map<Class<? extends YSContainerItemProvider>, AtomicInteger> mViewCounterMap;
private Map<Class<? extends YSContainerItemProvider>, View> mContentViewMap;
private View mInflateView;
private int mMaxContainSize = 3;
public YSProviderContainerView(Context context, AttributeSet attrs) {
super(context, attrs);
if (!this.isInEditMode()) {
this.init(attrs);
}
}
private void init(AttributeSet attrs) {
this.mViewCounterMap = new HashMap();
this.mContentViewMap = new HashMap();
}
public <T extends YSContainerItemProvider> View inflate(T t) {
View result = null;
if (this.mInflateView != null) {
this.mInflateView.setVisibility(GONE);
}
if (this.mContentViewMap.containsKey(t.getClass())) {
result = (View) this.mContentViewMap.get(t.getClass());
this.mInflateView = result;
((AtomicInteger) this.mViewCounterMap.get(t.getClass())).incrementAndGet();
}
if (result != null) {
if (result.getVisibility() == GONE) {
result.setVisibility(VISIBLE);
}
return result;
} else {
this.recycle();
result = t.newView(this.getContext(), this);
if (result != null) {
super.addView(result);
this.mContentViewMap.put(t.getClass(), result);
this.mViewCounterMap.put(t.getClass(), new AtomicInteger());
}
this.mInflateView = result;
return result;
}
}
private void recycle() {
if (this.mInflateView != null) {
int count = this.getChildCount();
if (count >= this.mMaxContainSize) {
Entry min = null;
Entry item;
for (Iterator view = this.mViewCounterMap.entrySet().iterator(); view.hasNext(); min = ((AtomicInteger) min.getValue()).get() > ((AtomicInteger) item.getValue()).get() ? item : min) {
item = (Entry) view.next();
if (min == null) {
min = item;
}
}
this.mViewCounterMap.remove(min.getKey());
View view1 = (View) this.mContentViewMap.remove(min.getKey());
this.removeView(view1);
}
}
}
}