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
- Android在Adapter通过自定义Provider构建多元UI展示
- Android如何通过content provider构建媒体文件数据库
- Android如何通过content provider构建媒体文件数据库
- Android如何通过content provider构建媒体文件数据库
- Android如何通过content provider构建媒体文件数据库
- 如何在Android中自定义 Content Provider
- Android UI高级控件之自定义Adapter(继承BaseAdapter)
- Android UI之Adapter
- Android自定义Content Provider
- android通过自定义view实现粒子效果展示
- 在Whibey中构建自定义provider-基于SQL Server 2000,Access以及MySQL
- android自定义Adapter
- Android 中自定义 Adapter
- Android之自定义Adapter
- android自定义adapter
- Android 中自定义 Adapter
- Android自定义adapter
- Android自定义Adapter适配器
- 初学java
- Dijkstra算法之优先队列优化版本 By ACReaper Dijkstra
- 文章标题
- Android获取CPU,内存等系统信息方法
- 使用CocoaPods做依赖管理
- Android在Adapter通过自定义Provider构建多元UI展示
- 前端代码异常监控方案window.onerror
- iOS开发上传图片-----流媒体格式
- Android - 实现图片圆角显示的几种方式
- Android 6.0权限的获取
- ESP8266烧写注意事项
- Class.getResource和ClassLoader.getResource的区别分析
- iOS二维码生成中间带图片Logo
- iOS 自定制导航栏 以及左右按钮 方便快捷 直接使用