实现app上对csdn的文章列表上拉刷新下拉加载以及加入缓存文章列表的功能 (制作csdn app 四)

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

/**

  • 记载数据的异步任务

  • @author zhy

*/

class LoadDatasTask extends AsyncTask<Integer, Void, Integer>

{

@Override

protected Integer doInBackground(Integer… params)

{

switch (params[0])

{

case LOAD_MORE:

loadMoreData();

break;

case LOAD_REFREASH:

return refreashData();

}

return -1;

}

@Override

protected void onPostExecute(Integer result)

{

switch (result)

{

case TIP_ERROR_NO_NETWORK:

ToastUtil.toast(getActivity(), “没有网络连接!”);

mAdapter.setDatas(mDatas);

mAdapter.notifyDataSetChanged();

break;

case TIP_ERROR_SERVER:

ToastUtil.toast(getActivity(), “服务器错误!”);

break;

default:

break;

}

mXListView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newsType));

mXListView.stopRefresh();

mXListView.stopLoadMore();

}

}

可以看到,这个类中又使用了 loadMoreData();和 refreashData();

先看loadMoreData:

/**

  • 会根据当前网络情况,判断是从数据库加载还是从网络继续获取

*/

public void loadMoreData()

{

// 当前数据是从网络获取的

if (isLoadingDataFromNetWork)

{

currentPage += 1;

try

{

List newsItems = mNewsItemBiz.getNewsItems(newsType, currentPage);

mNewsItemDao.add(newsItems);

mAdapter.addAll(newsItems);

} catch (CommonException e)

{

e.printStackTrace();

}

} else

// 从数据库加载的

{

currentPage += 1;

List newsItems = mNewsItemDao.list(newsType, currentPage);

mAdapter.addAll(newsItems);

}

}

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

接下来看refreashData方法:

/**

  • 下拉刷新数据

*/

public Integer refreashData()

{

if (NetUtil.checkNet(getActivity()))

{

isConnNet = true;

// 获取最新数据

try

{

List newsItems = mNewsItemBiz.getNewsItems(newsType, currentPage);

mAdapter.setDatas(newsItems);

isLoadingDataFromNetWork = true;

// 设置刷新时间

AppUtil.setRefreashTime(getActivity(), newsType);

// 清除数据库数据

mNewsItemDao.deleteAll(newsType);

// 存入数据库

mNewsItemDao.add(newsItems);

} catch (CommonException e)

{

e.printStackTrace();

isLoadingDataFromNetWork = false;

return TIP_ERROR_SERVER;

}

} else

{

isConnNet = false;

isLoadingDataFromNetWork = false;

// TODO从数据库中加载

List newsItems = mNewsItemDao.list(newsType, currentPage);

mDatas = newsItems;

//mAdapter.setDatas(newsItems);

return TIP_ERROR_NO_NETWORK;

}

return -1;

}

首先检查网络连接情况,没有的话,则去数据库加载,并设置isLoadingDataFromNetWork=false,如果有的话从网络加载,并清空该类型新闻的数据,更新数据库缓存数据。

下面是完整MainFragment.java:

package com.zhy.csdndemo;

import java.util.ArrayList;

import java.util.List;

import me
.maxwin.view.IXListViewLoadMore;

import me.maxwin.view.IXListViewRefreshListener;

import me.maxwin.view.XListView;

import android.annotation.SuppressLint;

import android.os.AsyncTask;

import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import com.zhy.bean.CommonException;

import com.zhy.bean.NewsItem;

import com.zhy.biz.NewsItemBiz;

import com.zhy.csdn.Constaint;

import com.zhy.csdndemo.adapter.NewsItemAdapter;

import com.zhy.csdndemo.dao.NewsItemDao;

import com.zhy.csdndemo.util.AppUtil;

import com.zhy.csdndemo.util.Logger;

import com.zhy.csdndemo.util.NetUtil;

import com.zhy.csdndemo.util.ToastUtil;

@SuppressLint(“ValidFragment”)

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;

/**

  • 当前数据是否是从网络中获取的

*/

private boolean isLoadingDataFromNetWork;

/**

  • 默认的newType

*/

private int newsType = Constaint.NEWS_TYPE_YEJIE;

/**

  • 当前页面

*/

private int currentPage = 1;

/**

  • 处理新闻的业务类

*/

private NewsItemBiz mNewsItemBiz;

/**

  • 与数据库交互

*/

private NewsItemDao mNewsItemDao;

/**

  • 扩展的ListView

*/

private XListView mXListView;

/**

  • 数据适配器

*/

private NewsItemAdapter mAdapter;

/**

  • 数据

*/

private List mDatas = new ArrayList();

/**

  • 获得newType

  • @param newsType

*/

public MainFragment(int newsType)

{

this.newsType = newsType;

Logger.e(newsType + “newsType”);

mNewsItemBiz = new NewsItemBiz();

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

{

return inflater.inflate(R.layout.tab_item_fragment_main, null);

}

@Override

public void onActivityCreated(Bundle savedInstanceState)

{

super.onActivityCreated(savedInstanceState);

mNewsItemDao = new NewsItemDao(getActivity());

mAdapter = new NewsItemAdapter(getActivity(), mDatas);

/**

  • 初始化

*/

mXListView = (XListView) getView().findViewById(R.id.id_xlistView);

mXListView.setAdapter(mAdapter);

mXListView.setPullRefreshEnable(this);

mXListView.setPullLoadEnable(this);

mXListView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newsType));

// mXListView.NotRefreshAtBegin();

if (isFirstIn)

{

/**

  • 进来时直接刷新

*/

mXListView.startRefresh();

isFirstIn = false;

}else

{

mXListView.NotRefreshAtBegin();

}

}

@Override

public void onRefresh()

{

new LoadDatasTask().execute(LOAD_REFREASH);

}

@Override

public void onLoadMore()

{

new LoadDatasTask().execute(LOAD_MORE);

}

/**

  • 记载数据的异步任务

  • @author zhy

*/

class LoadDatasTask extends AsyncTask<Integer, Void, Integer>

{

@Override

protected Integer doInBackground(Integer… params)

{

switch (params[0])

{

case LOAD_MORE:

loadMoreData();

break;

case LOAD_REFREASH:

return refreashData();

}

return -1;

}

@Override

protected void onPostExecute(Integer result)

{

switch (result)

{

case TIP_ERROR_NO_NETWORK:

ToastUtil.toast(getActivity(), “没有网络连接!”);

mAdapter.setDatas(mDatas);

mAdapter.notifyDataSetChanged();

break;

case TIP_ERROR_SERVER:

ToastUtil.toast(getActivity(), “服务器错误!”);

break;

default:

break;

}

mXListView.setRefreshTime(AppUtil.getRefreashTime(getActivity(), newsType));

mXListView.stopRefresh();

mXListView.stopLoadMore();

}

}

/**

  • 下拉刷新数据

*/

public Integer refreashData()

{

if (NetUtil.checkNet(getActivity()))

{

isConnNet = true;

// 获取最新数据

try

{

List newsItems = mNewsItemBiz.getNewsItems(newsType, currentPage);

mAdapter.setDatas(newsItems);

isLoadingDataFromNetWork = true;

// 设置刷新时间

AppUtil.setRefreashTime(getActivity(), newsType);

// 清除数据库数据

mNewsItemDao.deleteAll(newsType);

// 存入数据库

mNewsItemDao.add(newsItems);

} catch (CommonException e)

{

e.printStackTrace();

isLoadingDataFromNetWork = false;

return TIP_ERROR_SERVER;

}

} else

{

isConnNet = false;

isLoadingDataFromNetWork = false;

// TODO从数据库中加载

List newsItems = mNewsItemDao.list(newsType, currentPage);

mDatas = newsItems;

//mAdapter.setDatas(newsItems);

return TIP_ERROR_NO_NETWORK;

}

return -1;

}

/**

  • 会根据当前网络情况,判断是从数据库加载还是从网络继续获取

*/

public void loadMoreData()

{

// 当前数据是从网络获取的

if (isLoadingDataFromNetWork)

{

currentPage += 1;

try

{

List newsItems = mNewsItemBiz.getNewsItems(newsType, currentPage);

mNewsItemDao.add(newsItems);

mAdapter.addAll(newsItems);

} catch (CommonException e)

{

e.printStackTrace();

}

} else

// 从数据库加载的

{

currentPage += 1;

List newsItems = mNewsItemDao.list(newsType, currentPage);

mAdapter.addAll(newsItems);

}

}

}

接下来看看数据库的实现:

首先肯定是个Helper,没什么好说的。

package com.zhy.csdndemo.dao;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper

{

private static final String DB_NAME = “csdn_app_demo”;

public DBHelper(Context context)

{

super(context, DB_NAME, null, 1);

}

@Override

public void onCreate(SQLiteDatabase db)

{

/**

  • id,title,link,date,imgLink,content,newstype

*/

String sql = "create table tb_newsItem( _id integer primary key autoincrement , "

  • " title text , link text , date text , imgLink text , content text , newstype integer );";

db.execSQL(sql);

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

{

// TODO Auto-generated method stub

}

}

然后是我们的Dao:

package com.zhy.csdndemo.dao;

import java.util.ArrayList;

import java.util.List;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import com.zhy.bean.NewsItem;

import com.zhy.csdndemo.util.Logger;

public class NewsItemDao

{

private DBHelper dbHelper;

public NewsItemDao(Context context)

{

dbHelper = new DBHelper(context);

}

public void add(NewsItem newsItem)

{

Logger.e("add news newstype " + newsItem.getNewsType());

String sql = “insert into tb_newsItem (title,link,date,imgLink,content,newstype) values(?,?,?,?,?,?) ;”;

SQLiteDatabase db = dbHelper.getWritableDatabase();

db.execSQL(sql,

new Object[] { newsItem.getTitle(), newsItem.getLink(), newsItem.getDate(), newsItem.getImgLink(),

newsItem.getContent(), newsItem.getNewsType() });

db.close();

}

public void deleteAll(int newsType)

{

String sql = “delete from tb_newsItem where newstype = ?”;

SQLiteDatabase db = dbHelper.getWritableDatabase();

db.execSQL(sql, new Object[] { newsType });

db.close();

}

public void add(List newsItems)

{

for (NewsItem newsItem : newsItems)

{

add(newsItem);

}

}

/**

  • 根据newsType和currentPage从数据库中取数据

  • @param newsType

  • @param currentPage

  • @return

*/

public List list(int newsType, int currentPage)

{

Logger.e(newsType + " newsType");

Logger.e(currentPage + " currentPage");

// 0 -9 , 10 - 19 ,

List newsItems = new ArrayList();

try

{

int offset = 10 * (currentPage - 1);

String sql = "select title,link,date,imgLink,content,newstype from tb_newsItem where newstype = ? limit ?,? ";

SQLiteDatabase db = dbHelper.getReadableDatabase();

Cursor c = db.rawQuery(sql, new String[] { newsType + “”, offset + “”, “” + (offset + 10) });

NewsItem newsItem = null;

while (c.moveToNext())

{

newsItem = new NewsItem();

String title = c.getString(0);

String link = c.getString(1);

String date = c.getString(2);

String imgLink = c.getString(3);

String content = c.getString(4);

Integer newstype = c.getInt(5);

newsItem.setTitle(title);

newsItem.setLink(link);

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

如果你需要这些资料, ⬅ 专栏获取
ype from tb_newsItem where newstype = ? limit ?,? ";

SQLiteDatabase db = dbHelper.getReadableDatabase();

Cursor c = db.rawQuery(sql, new String[] { newsType + “”, offset + “”, “” + (offset + 10) });

NewsItem newsItem = null;

while (c.moveToNext())

{

newsItem = new NewsItem();

String title = c.getString(0);

String link = c.getString(1);

String date = c.getString(2);

String imgLink = c.getString(3);

String content = c.getString(4);

Integer newstype = c.getInt(5);

newsItem.setTitle(title);

newsItem.setLink(link);

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

[外链图片转存中…(img-L8dGkw6r-1719455313121)]

[外链图片转存中…(img-zzkpCBvq-1719455313122)]

[外链图片转存中…(img-ALcT9VAE-1719455313122)]

[外链图片转存中…(img-acFmFM2z-1719455313123)]

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

如果你需要这些资料, ⬅ 专栏获取

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值