android 应用架构随笔三(ListView)
import java.util.ArrayList;
import java.util.List; import com.heima.googleplay.holder.BaseHolder;
import com.heima.googleplay.holder.MoreHolder;
import com.heima.googleplay.manager.ThreadManager;
import com.heima.googleplay.utils.UIUtils; import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.RecyclerListener;
import android.widget.BaseAdapter;
import android.widget.ListView; public abstract class MyBaseAdapter<T> extends BaseAdapter implements
RecyclerListener { public ListView mListView; public MyBaseAdapter(ListView mListView, List<T> mDatas) {
this.mListView = mListView;
// 初始化一个界面可见的holder
mDisplayHolderLists = new ArrayList<BaseHolder>(); if (null != mListView) {
// 设置listview的回收监听
mListView.setRecyclerListener(this);
}
setData(mDatas);
} public List<T> mDatas;
private BaseHolder holder;
private List<BaseHolder> mDisplayHolderLists; public void setData(List<T> mDatas) {
this.mDatas = mDatas; } public List<T> getData() {
return mDatas;
} @Override
public int getCount() {
// +1 表示添加一个特殊的条目
return mDatas.size() + 1;
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mDatas.get(position);
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} // 表示加载更多
private final int MORE_ITEM_TYPE = 0;
// 表示普通的数据类型
private final int ITEM_VIEW_TYPE = 1;
private MoreHolder moreHolder; /**
* 获取到item的类型
*
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
// 判断当前是否是最后一个条目
if (position == getCount() - 1) {
return MORE_ITEM_TYPE;
} else {
return getInnerItemViewType(position);
}
} public int getInnerItemViewType(int position) {
// TODO Auto-generated method stub
return ITEM_VIEW_TYPE;
} /**
* 获取到一共有多少中数据类型
*
* @return
*/
@Override
public int getViewTypeCount() {
return super.getViewTypeCount() + 1;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView != null) {
holder = (BaseHolder) convertView.getTag();
} else {
if (getItemViewType(position) == MORE_ITEM_TYPE) {
holder = getMoreHolder();
} else {
holder = getHolder();
} }
if (getItemViewType(position) == ITEM_VIEW_TYPE) {
holder.setData(mDatas.get(position));
} // 把所有的holder全部丢入mDisplayHolderLists
mDisplayHolderLists.add(holder);
return holder.getRootView();
}
/**
* 获取更多的holder
* @return
*/
private BaseHolder getMoreHolder() {
if(moreHolder == null){
moreHolder = new MoreHolder(hasMore(),this);
} return moreHolder;
}
/**
* 表示有更多的数据
* @return
*/
public boolean hasMore() {
// TODO Auto-generated method stub
return true;
} public abstract BaseHolder getHolder(); /**
* 当listview回收的时候调用当前的方法
*/
@Override
public void onMovedToScrapHeap(View view) {
System.out.println("我被回收了.....");
if (null != view) {
BaseHolder holder = (BaseHolder) view.getTag();
if (null != holder) {
synchronized (mDisplayHolderLists) {
mDisplayHolderLists.remove(holder);
} }
} }
private boolean isLoading = false;
/**
* 加载更多
*/
public void loadMore() {
if(!isLoading){
isLoading = true;
ThreadManager.getLongPool().execute(new Runnable() { @Override
public void run() {
final List list = onLoadMore();
UIUtils.runInMainThread(new Runnable() { @Override
public void run() {
if(null == list){
//如果服务器返回的数据等于null。那么设置一个错误状态
getMoreHolder().setData(MoreHolder.ERROR);
}else if(list.size() < 20){
//如果服务器返回的数据小于20条。那么设置没有更多数据的状态
getMoreHolder().setData(MoreHolder.NO_MORE);
}else{
getMoreHolder().setData(MoreHolder.HAS_MORE);
} if(null != list){
if(null !=mDatas){
mDatas.addAll(list);
}else{
setData(list);
}
}
//刷新界面
notifyDataSetChanged();
isLoading = false;
}
}); }
});
} } protected abstract List onLoadMore(); }
MyBaseAdapter
package com.heima.googleplay.widget; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import com.heima.googleplay.R;
import com.heima.googleplay.manager.ThreadManager;
import com.heima.googleplay.utils.UIUtils; import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
/**
*
*
* ============================================================
**/
public abstract class LoadingPage extends FrameLayout {
//默认状态
private final int UN_LOADING = 1;
//加载状态
private final int LOADING = 2;
//加载失败状态
private final int ERROR = 3;
//加载成功。然后服务器没有返回数据
private final int EMPTY = 4;
//加载成功的状态
private final int SUCCESS = 5;
//用来记录某种状态
private int mState;
private View mLoadingView;
private View mErrorView;
private View mEmptyView; private View mSuccessView;
public LoadingPage(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
} private void init() {
//首先赋值
mState = UN_LOADING; mLoadingView = createLoadingView(); if(null != mLoadingView){
addView(mLoadingView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
} mErrorView = createErrorView(); if(null != mErrorView){
addView(mErrorView,new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
} mEmptyView = createEmptyView(); if(null != mEmptyView ){
addView(mEmptyView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
} showSafePage(); } private void showSafePage() {
UIUtils.runInMainThread(new Runnable() { @Override
public void run() {
showPage(); }
}); } protected void showPage() {
if(null != mLoadingView){
mLoadingView.setVisibility(mState == UN_LOADING || mState == LOADING ? View.VISIBLE : View.INVISIBLE);
} if(null != mErrorView){
mErrorView.setVisibility(mState == ERROR ? View.VISIBLE : View.INVISIBLE);
} if(null != mEmptyView){
mEmptyView.setVisibility(mState == EMPTY ? View.VISIBLE : View.INVISIBLE);
} if(null == mSuccessView && mState == SUCCESS ){
mSuccessView = createSuccessView();
addView(mSuccessView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
}
if(null != mSuccessView){
mSuccessView.setVisibility(mState == SUCCESS ? View.VISIBLE : View.INVISIBLE);
}
} public abstract View createSuccessView(); private View createEmptyView() {
// TODO Auto-generated method stub
return UIUtils.inflate(R.layout.loading_page_empty);
} private View createErrorView() {
// TODO Auto-generated method stub
return UIUtils.inflate(R.layout.loading_page_error);
} private View createLoadingView() {
// TODO Auto-generated method stub
return UIUtils.inflate(R.layout.loading_page_loading);
} public LoadingPage(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} public LoadingPage(Context context) {
super(context);
init();
}
// //加载失败状态
// private final int ERROR = 3;
// //加载成功。然后服务器没有返回数据
// private final int EMPTY = 4;
// //加载成功的状态
// private final int SUCCESS = 5;
public enum LoadResult{
ERROR(3),EMPTY(4),SUCCESS(5);
int value ;
LoadResult(int value){
this.value = value;
}
public int getValue() {
return value;
}
} private class LoadTask implements Runnable{ @Override
public void run() {
final LoadResult result = Load();
UIUtils.runInMainThread(new Runnable() { @Override
public void run() { mState = result.getValue(); showPage();
}
}); } } public void show() {
if(mState == ERROR || mState == EMPTY){
mState = UN_LOADING;
} if(mState == UN_LOADING){
mState = LOADING; LoadTask task = new LoadTask();
ThreadManager.getLongPool().execute(task);
// ExecutorService service = Executors.newFixedThreadPool(3);
// LoadTask task = new LoadTask();
// service.execute(task);
}
showSafePage();
} public abstract LoadResult Load() ; }
LoadingPage
android 应用架构随笔三(ListView)的更多相关文章
- android 应用架构随笔六(Loading加载页面)
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import com.heima ...
- android 应用架构随笔四(View、ViewGroup)
View表示了用户界面的基本构建模块. 一个View占用了屏幕上的一个矩形区域并且负责界面绘制和事件处理.手机屏幕上所有看得见摸得着的都是View. Activity是四大组件中唯一一个用来和用户进行 ...
- android 应用架构随笔五(ActionBar与侧滑菜单DrawerLayout)
ActionBar(V7)的添加非常简单,只需要在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类就可以了,在Androi ...
- android 应用架构随笔二(定义BaseApplication并配置Application)
定义BaseApplication并配置Application import android.app.Application; import android.os.Handler; /** * * = ...
- android 应用架构随笔一(架构搭建)
1.拷贝积累utils以及PagerTab类 2.定义BaseApplication类 3.定义BaseActivity类 4.改写MainActivity 5.定义布局文件 6.定义BaseFrag ...
- android 项目学习随笔三(Fragment )
1.在主页面(activity引用Fragment )的布局文件中定义FrameLayout ,加载Fragment <FrameLayout xmlns:android="http ...
- Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!
Android实训案例(三)--实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果! 感叹离春节将至,也同时感叹时间不等人,一年又一年,可是我依然是android道路上的小菜鸟,这篇讲 ...
- Android应用架构
Android开发生态圈的节奏非常之快.每周都会有新的工具诞生,类库的更新,博客的发表以及技术探讨.如果你外出度假一个月,当你回来的时候可能已经发布了新版本的Support Library或者Play ...
- 【译】Android应用架构
Android开发生态圈的节奏非常之快.每周都会有新的工具诞生,类库的更新,博客的发表以及技术探讨.如果你外出度假一个月,当你回来的时候可能已经发布了新版本的Support Library或者Play ...
随机推荐
- java.lang.NoClassDefFoundError: Could not initialize class ......
在测试数据字典工具类的时候一直报这个错误,找了好久,原来是SpringContextUtils这个类没有放入到容器中. 但是我在SpringContextUtils上面加了注解的,为什么注解没有扫到呢 ...
- Windows 服务器使用FTP出现“当前的安全设置不允许从该位置下载文件" 警告
为了安全,Windows服务器默认禁用了从网上下载文件的安全选项.此错误即是出现在这里,所以打开这个选项即可: 控制面板 —— Internet选项 ——安全 —— 找到“自定义级别” —— 找到“ ...
- idea 的问题
IDEA的maven项目中,默认源代码目录下的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉. 如果使用的是Eclipse,Eclipse的src目录下的xml等资源 ...
- SQL截取字符串函数
A.截取从字符串左边开始N个字符 以下是代码片段: Declare @S1 varchar(100) Select @S1='http://www.xrss.cn' Select Left( ...
- 11月23日《奥威Power-BI报表集成到其他系统》腾讯课堂开课啦
听说明天全国各地区都要冷到爆了,要是天气冷到可以放假就好了.想象一下大冷天的一定要在被窝里度过才对嘛,索性明天晚上来个相约吧,相约在被窝里看奥威Power-BI公开课如何? 上周奥威公开 ...
- box2dweb基础
简介 大名鼎鼎的物理引擎box2d基本上大家都听说过,网上有两个javascript版本的box2d库,一个时box2djs,已经停止维护,一个是box2dweb.下面就来介绍一下box2dweb的基 ...
- ios网络_json数据解析
网络上数据传输以json或者xml格式. json是字典 或者 数组 或者字典跟数组嵌套的形式.解析json就是把json反序列化(解析)---把json转换为oc对象.json序列化就是把oc对象转 ...
- Request、Servlet及其子接口
最近看tomcat源码,这类接口多的有点眩,整理出来看一下.(基于tomcat4) javax.servlet.ServletRequset接口,和org.apache.catalina.Reques ...
- Java Servlet(三):Servlet中ServletConfig对象和ServletContext对象
本文将记录ServletConfig/ServletContext中提供了哪些方法,及方法的用法. ServletConfig是一个抽象接口,它是由Servlet容器使用,在一个servlet对象初始 ...
- CentOS6.5 安装HAProxy 1.5.20
[在CentOS下安装haproxy] sudo yum install haproxy 编辑配置文件 vim /etc/haproxy/haproxy.cfg #------------------ ...