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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值