博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IT资讯----------上拉加载,下拉刷新和缓存
阅读量:7234 次
发布时间:2019-06-29

本文共 18744 字,大约阅读时间需要 62 分钟。

该App已经上传到百度应用市场:

有兴趣的可以下载看看。接下来我会公布源代码,不过该App并没有使用代码混淆,所以可以通过反编译清楚的看到源码。

首先是对MainFragment.java编写,真对XListView实现下拉刷新和上拉加载。

@Overridepublic void onLoadMore() {    new LoadDatasTask().execute(LOAD_MORE);}@Overridepublic void onRefresh() {    new LoadDatasTask().execute(LOAD_REFREASH);}

我们对下拉刷新和上拉加载调用了一个异步任务,传入了操作的标识符,下面具体看个类:

  1. /** * 记载数据的异步任 * * @author */class LoadDatasTask extends AsyncTask
    { @Override protected Integer doInBackground(Integer... params) { switch (params[0]) { case LOAD_MORE: loadMoreData(); break; case LOAD_REFREASH: refreashData(); break; } return -1; } @Override protected void onPostExecute(Integer result) { switch (result) { case TIP_ERROR_NO_NETWORK: Toast.makeText(getActivity(), "没网络连接", Toast.LENGTH_SHORT).show(); mAdapter.notifyDataSetChanged(); mXlistView.stopRefresh(); break; case TIP_ERROR_SERVER: Toast.makeText(getActivity(), "服务器错误", Toast.LENGTH_SHORT).show(); break; default: break; } switch (select) { case 1: mXlistView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newTypes)); break; case 2: mXlistView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newTypes_cto)); break; case 3: mXlistView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newTypes_blog_house)); break; case 4: mXlistView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newTypes_iteye)); break; } mXlistView.stopRefresh(); mXlistView.stopLoadMore(); }}
可以看到,这个类中又使用了
 

loadMoreData();和 refreashData();

先看loadMoreData:

/** * 根据网络决定是从哪里取数据 */public void loadMoreData() {    System.out.println("isLoadingDataFromNetwork------" + isLoadingDataFromNetwork);    if (isLoadingDataFromNetwork) {        currentPage =currentPage+ 1;        List
newsItems = null; try { switch (select) { case 1: newsItems = newsItemBiz.getNewsItems(newTypes, currentPage); break; case 2: newsItems = newItem51CTO.getNewsItems(newTypes_cto, currentPage); break; case 3: newsItems = blogHouse.getNewsItems(newTypes_blog_house, currentPage); break; case 4: newsItems = iTeye.getNewsItems(newTypes_iteye, currentPage,newTypes_iteye); break; } newsItemDao.add(newsItems,select); mAdapter.addAll(newsItems); } catch (Exception e) { e.printStackTrace(); } } else { // 从数据库加载的 currentPage += 1; List
newsItems = null; switch (select) { case 1: newsItems = newsItemDao.list(newTypes, currentPage,select); break; case 2: newsItems = newsItemDao.list(newTypes_cto, currentPage,select); break; case 3: newsItems = newsItemDao.list(newTypes_blog_house, currentPage,select); break; case 4: newsItems = newsItemDao.list(newTypes_iteye, currentPage,select); break; } if(newsItems!=null) { mAdapter.addAll(newsItems); } }}

可以看到,如果当前app上的数据是从网络更新的即最新数据,我们会继续去网络加载下一页的数据,并且使用mNewsItemDao.add方法,插入我们的app的数据库中,供没有网络时使用。如果当前数据是缓存数据,我们则继续去数据库加载。

接下来看refreashData方法:

[java] 
 
 
  1. /** * 刷新获取数据 * * @return */public Integer refreashData() {    if (NetUtil.checkNet(getActivity())) {        isConnNet = true;        List
    newsItems = null; try { switch (select) { case 1: newsItems = newsItemBiz.getNewsItems(newTypes, currentPage); List
    newsItem1 = new ArrayList<>(); for (int i = 0; i <= newsItems.size() / 2; i++) { newsItem1.add(newsItems.get(i)); } mAdapter.setDatas(newsItem1); mDatas=newsItem1; isLoadingDataFromNetwork = true; // 设置刷新时间 AppUtil.setRefreashTime(getActivity(), newTypes); // 清除数据库数据 newsItemDao.deleteAll(newTypes,select); // 存入数据库 newsItemDao.add(newsItems,select); break; case 2: newsItems = newItem51CTO.getNewsItems(newTypes_cto, currentPage); List
    newsItem2 = new ArrayList<>(); for (int i = 0; i <= newsItems.size() / 2; i++) { newsItem2.add(newsItems.get(i)); } mAdapter.setDatas(newsItem2); mDatas=newsItem2; isLoadingDataFromNetwork = true; // 设置刷新时间 AppUtil.setRefreashTime(getActivity(), newTypes_cto); // 清除数据库数据 newsItemDao.deleteAll(newTypes_cto,select); // 存入数据库 newsItemDao.add(newsItem2,select); break; case 3: newsItems = blogHouse.getNewsItems(newTypes_blog_house, currentPage); List
    newsItem3 = new ArrayList<>(); for (int i = 0; i <= newsItems.size() / 2; i++) { newsItem3.add(newsItems.get(i)); } mAdapter.setDatas(newsItem3); mDatas=newsItem3; isLoadingDataFromNetwork = true; // 设置刷新时间 AppUtil.setRefreashTime(getActivity(), newTypes_blog_house); // 清除数据库数据 newsItemDao.deleteAll(newTypes_blog_house,select); // 存入数据库 newsItemDao.add(newsItem3,select); break; case 4: newsItems = iTeye.getNewsItems(newTypes_iteye, currentPage, newTypes_iteye); List
    newsItem4 = new ArrayList<>(); for (int i = 0; i <= newsItems.size() / 2; i++) { newsItem4.add(newsItems.get(i)); } mAdapter.setDatas(newsItem4); mDatas=newsItem4; isLoadingDataFromNetwork = true; // 设置刷新时间 AppUtil.setRefreashTime(getActivity(), newTypes_iteye); // 清除数据库数据 newsItemDao.deleteAll(newTypes_iteye,select); // 存入数据库 newsItemDao.add(newsItem4,select); break; } // mDatas = newsItems; } catch (Exception e) { e.printStackTrace(); isLoadingDataFromNetwork = false; return TIP_ERROR_SERVER; } } else { isConnNet = false; isLoadingDataFromNetwork = false; List
    newsItems = null; switch (select) { case 1: //从数据库取数据 newsItems = newsItemDao.list(newTypes, currentPage,select); break; case 2: newsItems = newsItemDao.list(newTypes_cto, currentPage,select); break; case 3: newsItems = newsItemDao.list(newTypes_blog_house, currentPage,select); break; case 4: newsItems = newsItemDao.list(newTypes_iteye, currentPage,select); break; } mDatas = newsItems; return TIP_ERROR_NO_NETWORK; } return -1;}
首先检查网络连接情况,没有的话,则去数据库加载,并设置isLoadingDataFromNetWork=false,如果有的话从网络加载,并清空该类型新闻的数据,更新数据库缓存数据。

下面是完整MainFragment.java:

public class MainFragment extends Fragment implements IXListViewRefreshListener, IXListViewLoadMore {    private static final int LOAD_MORE = 0x110;    private static final int LOAD_REFREASH = 0x111;    private static final int TIP_ERROR_NO_NETWORK = 0x112;    private static final int TIP_ERROR_SERVER = 0x113;    //是否是第一次进入    private boolean isFirstIn = true;    //是否连接网络    private boolean isConnNet = false;    //选择是选择哪个博客  1:CSDN  2:51CTO   3:博客园    4:ITEYE博客    private int select;    //选择的是博客的哪个    private int selectType;    /**     * 当前数据是否从网络获取     */    private boolean isLoadingDataFromNetwork=true;    //取CSDN数据    private int newTypes = Constant.NEW_TYPE_YEJIE;    //取51CTO数据    private int newTypes_cto = Constant.NEWS_TYPE_NETWORK;    //取博客园数据    private int newTypes_blog_house = Constant.NEWS_TYPE_HOME;    //取ITeye数据    private int newTypes_iteye = Constant.NEWS_TYPE_NEW;    private int currentPage = 1;    //CSDN    private NewsItemBiz newsItemBiz;    //51CTO    private NewItem51CTO newItem51CTO;    //博客园    private NewItemBlogHouse blogHouse;    //ITeye    private NewItemITeye iTeye;    private me.maxwin.view.XListView mXlistView;    private NewsItemAdapter mAdapter;    private List
mDatas = new ArrayList
(); /** * 与数据库交互 */ private NewsItemDao newsItemDao; public MainFragment() { } public MainFragment(int newsType, int select) { this.newTypes = newsType; this.newTypes_cto = newsType + 5; this.newTypes_blog_house = newsType + 9; this.newTypes_iteye = newsType + 13; this.select = select; newsItemBiz = new NewsItemBiz(); newItem51CTO = new NewItem51CTO(); blogHouse = new NewItemBlogHouse(); iTeye = new NewItemITeye(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tab_item_fragment_main, container, false); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); newsItemDao = new NewsItemDao(getContext()); mAdapter = new NewsItemAdapter(getActivity(), mDatas, select); mAdapter.setSelectType(newTypes_iteye); mXlistView = (me.maxwin.view.XListView) getView().findViewById(R.id.id_xlistView); mXlistView.setAdapter(mAdapter); mXlistView.setPullRefreshEnable(this); mXlistView.setPullLoadEnable(this); switch (select) { case 1: mXlistView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newTypes)); break; case 2: mXlistView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newTypes_cto)); break; case 3: mXlistView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newTypes_blog_house)); break; case 4: mXlistView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newTypes_iteye)); break; } // mXlistView.startRefresh(); mXlistView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView
parent, View view, int position, long id) { NewsItem newsItem = mDatas.get(position-1); NewsItem nextItem=mDatas.get(position); Intent intent=null; if (newTypes_iteye==17){ intent = new Intent(getActivity(), SubjectsActivity.class); intent.putExtra("url", newsItem.getLink()); }else { intent = new Intent(getActivity(), NewsContentActivity.class); intent.putExtra("url", newsItem.getLink()); intent.putExtra("nextUrl", nextItem.getLink()); intent.putExtra("select", select); intent.putExtra("cuttenrPage", currentPage); } startActivity(intent); } }); if (isFirstIn) { /** * 进来时直接刷新 */ mXlistView.startRefresh(); isFirstIn = false; } else { mXlistView.NotRefreshAtBegin(); } } @Override public void onLoadMore() { new LoadDatasTask().execute(LOAD_MORE); } @Override public void onRefresh() { new LoadDatasTask().execute(LOAD_REFREASH); } /** * 记载数据的异步任 * * @author */ class LoadDatasTask extends AsyncTask
{ @Override protected Integer doInBackground(Integer... params) { switch (params[0]) { case LOAD_MORE: loadMoreData(); break; case LOAD_REFREASH: refreashData(); break; } return -1; } @Override protected void onPostExecute(Integer result) { switch (result) { case TIP_ERROR_NO_NETWORK: Toast.makeText(getActivity(), "没网络连接", Toast.LENGTH_SHORT).show(); mAdapter.notifyDataSetChanged(); mXlistView.stopRefresh(); break; case TIP_ERROR_SERVER: Toast.makeText(getActivity(), "服务器错误", Toast.LENGTH_SHORT).show(); break; default: break; } switch (select) { case 1: mXlistView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newTypes)); break; case 2: mXlistView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newTypes_cto)); break; case 3: mXlistView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newTypes_blog_house)); break; case 4: mXlistView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newTypes_iteye)); break; } mXlistView.stopRefresh(); mXlistView.stopLoadMore(); } } /** * 刷新获取数据 * * @return */ public Integer refreashData() { if (NetUtil.checkNet(getActivity())) { isConnNet = true; List
newsItems = null; try { switch (select) { case 1: newsItems = newsItemBiz.getNewsItems(newTypes, currentPage); List
newsItem1 = new ArrayList<>(); for (int i = 0; i <= newsItems.size() / 2; i++) { newsItem1.add(newsItems.get(i)); } mAdapter.setDatas(newsItem1); mDatas=newsItem1; isLoadingDataFromNetwork = true; // 设置刷新时间 AppUtil.setRefreashTime(getActivity(), newTypes); // 清除数据库数据 newsItemDao.deleteAll(newTypes,select); // 存入数据库 newsItemDao.add(newsItems,select); break; case 2: newsItems = newItem51CTO.getNewsItems(newTypes_cto, currentPage); List
newsItem2 = new ArrayList<>(); for (int i = 0; i <= newsItems.size() / 2; i++) { newsItem2.add(newsItems.get(i)); } mAdapter.setDatas(newsItem2); mDatas=newsItem2; isLoadingDataFromNetwork = true; // 设置刷新时间 AppUtil.setRefreashTime(getActivity(), newTypes_cto); // 清除数据库数据 newsItemDao.deleteAll(newTypes_cto,select); // 存入数据库 newsItemDao.add(newsItem2,select); break; case 3: newsItems = blogHouse.getNewsItems(newTypes_blog_house, currentPage); List
newsItem3 = new ArrayList<>(); for (int i = 0; i <= newsItems.size() / 2; i++) { newsItem3.add(newsItems.get(i)); } mAdapter.setDatas(newsItem3); mDatas=newsItem3; isLoadingDataFromNetwork = true; // 设置刷新时间 AppUtil.setRefreashTime(getActivity(), newTypes_blog_house); // 清除数据库数据 newsItemDao.deleteAll(newTypes_blog_house,select); // 存入数据库 newsItemDao.add(newsItem3,select); break; case 4: newsItems = iTeye.getNewsItems(newTypes_iteye, currentPage, newTypes_iteye); List
newsItem4 = new ArrayList<>(); for (int i = 0; i <= newsItems.size() / 2; i++) { newsItem4.add(newsItems.get(i)); } mAdapter.setDatas(newsItem4); mDatas=newsItem4; isLoadingDataFromNetwork = true; // 设置刷新时间 AppUtil.setRefreashTime(getActivity(), newTypes_iteye); // 清除数据库数据 newsItemDao.deleteAll(newTypes_iteye,select); // 存入数据库 newsItemDao.add(newsItem4,select); break; } // mDatas = newsItems; } catch (Exception e) { e.printStackTrace(); isLoadingDataFromNetwork = false; return TIP_ERROR_SERVER; } } else { isConnNet = false; isLoadingDataFromNetwork = false; List
newsItems = null; switch (select) { case 1: //从数据库取数据 newsItems = newsItemDao.list(newTypes, currentPage,select); break; case 2: newsItems = newsItemDao.list(newTypes_cto, currentPage,select); break; case 3: newsItems = newsItemDao.list(newTypes_blog_house, currentPage,select); break; case 4: newsItems = newsItemDao.list(newTypes_iteye, currentPage,select); break; } mDatas = newsItems; return TIP_ERROR_NO_NETWORK; } return -1; } /** * 根据网络决定是从哪里取数据 */ public void loadMoreData() { System.out.println("isLoadingDataFromNetwork------" + isLoadingDataFromNetwork); if (isLoadingDataFromNetwork) { currentPage =currentPage+ 1; List
newsItems = null; try { switch (select) { case 1: newsItems = newsItemBiz.getNewsItems(newTypes, currentPage); break; case 2: newsItems = newItem51CTO.getNewsItems(newTypes_cto, currentPage); break; case 3: newsItems = blogHouse.getNewsItems(newTypes_blog_house, currentPage); break; case 4: newsItems = iTeye.getNewsItems(newTypes_iteye, currentPage,newTypes_iteye); break; } newsItemDao.add(newsItems,select); mAdapter.addAll(newsItems); } catch (Exception e) { e.printStackTrace(); } } else { // 从数据库加载的 currentPage += 1; List
newsItems = null; switch (select) { case 1: newsItems = newsItemDao.list(newTypes, currentPage,select); break; case 2: newsItems = newsItemDao.list(newTypes_cto, currentPage,select); break; case 3: newsItems = newsItemDao.list(newTypes_blog_house, currentPage,select); break; case 4: newsItems = newsItemDao.list(newTypes_iteye, currentPage,select); break; } if(newsItems!=null) { mAdapter.addAll(newsItems); } } } @Override public void onResume() { super.onResume(); MobclickAgent.onPageStart("MainFragment"); } @Override public void onPause() { super.onPause(); MobclickAgent.onPageEnd("MainFragment"); }}

转载地址:http://hvmfm.baihongyu.com/

你可能感兴趣的文章
【转】深入浅出Android Support Annotation
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
MYSQL线程池总结(一)
查看>>
c++11 gcc4.8.x安装
查看>>
工厂方法模式
查看>>
(ETW) Event Trace for Windows 提高 (含pdf下载)
查看>>
WPS2012交叉引用提示word比wps这种强烈的更新参考
查看>>
微信支付[v3]
查看>>
linux网络配置相关命令、虚拟网络接口eth0:0
查看>>
意义和公式的协方差
查看>>
64脚和小于64脚的STM32进行AD时注意,参照电源处理方法(转)
查看>>
对想读社会科学各个领域研究生朋友的建议
查看>>
mysql_use_result & mysql_store_result & MYSQLI_ASYNC
查看>>
进程调度
查看>>
Oracle job调用存储过程
查看>>
Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析 ....
查看>>
kettle转换和作业插件开发及调试
查看>>
基于FPGA的并行计算技术
查看>>
学习笔记 Android.mk 搜索自己主动
查看>>
jquery在元素上收购事件
查看>>