Android在Adapter通过自定义Provider构建多元UI展示

来源:互联网 发布:淘宝清退中小卖家 编辑:程序博客网 时间:2024/06/09 21:12

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);            }        }    }}
0 0
原创粉丝点击