万能设配器代码 带加载更多
2016-02-18 15:13
399 查看
public abstract class MyBaseAdapter<T> extends BaseAdapter { protected List<T> list; //普通条目 private static final int LIST_ITEM=0; //加载更多条目 private static final int LOAD_MODR=1; private MoreHolder moreholder; public MyBaseAdapter(List<T> list) { this.list = list; } public List<T> getList(){ return list; } @Override public int getCount() { return list.size()+1; } public int getListSize(){ return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getViewTypeCount() { return super.getViewTypeCount()+1; } @Override public int getItemViewType(int position) { if(position==getCount()-1){ return LOAD_MODR; }else { return getInnerItemType(position); } } /** * 子类可覆盖此方法用于listitem有多个 条目的情况 */ public int getInnerItemType(int position) { return LIST_ITEM; } @Override public View getView(int position, View convertView, ViewGroup parent) { BaseHolder holder = null; if (convertView == null) { if(getItemViewType(position)==LOAD_MODR){ holder=getMoreHolder(); }else{ holder=getHolder(); } }else{ holder=(BaseHolder)convertView.getTag();//固定的 } if(getItemViewType(position)==LIST_ITEM){ holder.setData(list.get(position)); } return holder.getRootView(); } /** * 返回加载更多的holder * @return */ private MoreHolder getMoreHolder() { if(moreholder==null) //避免重复创建对象 moreholder = new MoreHolder(isHasMore(),this); return moreholder; } /** * 设置是否还有数据的状态 默认有数据 可以给子类覆盖 如果不需要从服务器获取数据的话 * @return */ public Boolean isHasMore() { return true; } public abstract BaseHolder<T> getHolder(); /** * 根据访问网络获取的结果改变MoreHolder的状态 此处处理业务逻辑 具体的访问网络的请求地址..不确定 所以使用抽象 让子类去实现 */ public void loadMore() { ThreadManager.getThreadPoolProxy().execute(new RunnableTask()); } class RunnableTask implements Runnable{ @Override public void run() { //访问网络返回的数据 是一般条目 final List<T> more_list=onLoad();//加载网络获取的路径未知所有抽象 // 如果假定服务器一次返回的数据是二十条 //那么就有三种状态 1服务器返回少于20条 那么代表服务器没有更多数据了 将状态置为NO_MORE //2服务器返回20 条 那么还有更多数据 HAS_MORE //3服务器请求失败 LOAD_ERROR //更新ui在使用UIUTils UIUtils.runInMainThread(new Runnable() { @Override public void run() { if (more_list != null) { if (more_list.size() == 20) { moreholder.setData(MoreHolder.LOAD_MORE); } if (more_list.size() < 20) { moreholder.setData(MoreHolder.NO_MORE); } } else { moreholder.setData(MoreHolder.LOAD_ERROR); } if (more_list != null) { //将数据加入到当前listview的集合中 list.addAll(more_list); notifyDataSetChanged();//更新ListView } } }); } } /** * 访问网络获取更多的数据 * @return */ public abstract List<T> onLoad(); }
public abstract class BaseHolder<T> { private View view; private T data; protected BaseHolder() { view = initView(); view.setTag(this); } public void setData(T data) { this.data = data; setData2View(); } public T getData() { return data; } public View getRootView() { return view; } public abstract void setData2View(); public abstract View initView(); }
相关文章推荐
- VC++的窗口句柄和窗口ID
- Cef概览
- mark关于Java语言Static的生命周期
- 怎么限制Google自己主动调整字体大小
- php代码缓存问题
- Cef重要概念
- C语言二分查找法
- RxJava 操作符分类
- matlab画甘特图
- Cef应用资源布局
- Java基础 —— 数据类型
- Struct2入门学习(完整代码)
- Cef应用程序结构
- Java集合
- java switch 异常 case expressions must be constant expressions
- eclipse导入项目出错
- Python语言实践分析 -- 闭包
- Springmvc整合tiles框架简单入门示例(maven)
- ContentProvider和Uri详解
- 多重继承《C++ primer 3th》