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 ...
随机推荐
- mongoDB命令
. getLastError db.runCommand({getLastError:}) . buildInfo //返回mongoDB的服务器版本号和操作系统类型 db.runCommand({} ...
- C++经典编程题#3:数字求和
总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个正整数a,以及另外的5个正整数,问题是:这5个整数中,小于a的整数的和是多少? 输入 输入一行,只包括6个小于100的正整数, ...
- 我的工具箱之MyEclipse9.1
下载地址:http://pan.baidu.com/s/1bbuN1s 这个工具是用来开发Java程序,自带JDK和Tomcat,功能全面周到,使用方便. 市面上MyEclipse版本很多,但都需要破 ...
- Objective-C的对象模型
Objective-C是一门面向对象,并且在C的基础上加入了Smalltalk式的消息机制而形成的编程语言,它主要被苹果公司用于开发Mac OS X和iOS操作系统.既然Objective-C是面向对 ...
- 11种dialogBox样式打包开源,逐一详解
期待已久,APICloud官方总算把各种提示样式给封装了,再也不用苦逼的自己各种被虐着封装自定义样式了.这个分享我把 dialogBox 模块的 11 个样式分别实现个简单的效果,其中将 alert ...
- APICloud十一月线下活动(杭州、上海)
阿里云创业大学 ——APICloud/银杏谷移动课堂[杭州站] 时间:2015年11月28日13:30-16:30 地点:文三路华星时代广场A座3楼银杏谷1024孵化器 主办:APICloud.阿里云 ...
- 30天,APP创业从0到1【7.26苏州站】
活动概况 时间:2015年7月26日13:30-16:30 地点:创客巢(苏州吴中区玉山路646号金枫广告产业园B栋4楼) 主办:APICloud.融云.鱼多多 网址:www.apicloud.com ...
- 如何在SQLServer中处理每天四亿三千万记录
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- 使用Storm实现实时大数据分析
摘要:随着数据体积的越来越大,实时处理成为了许多机构需要面对的首要挑战.Shruthi Kumar和Siddharth Patankar在Dr.Dobb’s上结合了汽车超速监视,为我们演示了使用Sto ...
- linux下如何启动/停止/重启mysql:
一.启动方式1.使用linux命令service 启动:service mysqld start2.使用 mysqld 脚本启动:/etc/inint.d/mysqld start3.使用 safe_ ...