app上でcsdnの文章リストにドロップダウンロードをリフレッシュし、文章リストをキャッシュする機能を実現する(csdn app 4を作成する)...
14179 ワード
転載は出典を明記してください.http://blog.csdn.net/lmj623565791/article/details/23698511
今日は引き続き私たちのcsdnクライアントの未完成の機能を実現して、本編のブログは次にクライアントの上でcsdnの上の各種の下の文章のリストを表示します(csdn appの3を作成します)引き続き私たちのappを改善します.
今日の目標は:
1、文章リストのドロップダウンを更新し、アップロードする.
2、ネットがない場合でも、携帯電話にキャッシュされた文章のリストや、アップロードなどを見ることができます.
おおよその効果図:
1、まずMainFragment.javaに対して書き、XListViewに対してドロップダウン・リフレッシュとアップロードを実現する.
ドロップダウン・リフレッシュとプルアップ・ロードに対して非同期タスクを呼び出し、操作の識別子を入力しました.次に、クラスを参照してください.
このクラスでまた使われていることがわかります
loadMoreData();およびrefreashData()
まずloadMoreDataを見てみましょう.
現在のapp上のデータがネットワークから更新された最新のデータであれば、次のページのデータをネットワークにロードし続け、mNewsItemDao.addメソッドを使用して、ネットワークがない場合に使用するためにappのデータベースに挿入します.現在のデータがキャッシュされている場合は、データベースへのロードを続行します.
次に、refreashDataメソッドを見てみましょう.
まずネットワーク接続状況をチェックし、ない場合はデータベースにロードし、isLoadingDataFromNetWork=falseを設定し、ある場合はネットワークからロードし、そのタイプのニュースのデータをクリアし、データベースキャッシュデータを更新します.
次は完全なMainFragment.javaです.
次に、データベースの実装を見てみましょう.
まずHelperに違いない.何も言うことはない.
そして私たちのDao:
単一レコード、複数レコード、タイプに応じてレコードを削除するなどの方法が提供される.
最後にネットワークの補助クラスも貼り付けます.
今日はこれで終わりますが、基本的には、文章の詳細の展示と、ページの画像の保存が残ります.
もしこの文章があなたに役に立つなら、一つにしてもいいです.
ソースコードはここをクリックしてダウンロードします
今日は引き続き私たちのcsdnクライアントの未完成の機能を実現して、本編のブログは次にクライアントの上でcsdnの上の各種の下の文章のリストを表示します(csdn appの3を作成します)引き続き私たちのappを改善します.
今日の目標は:
1、文章リストのドロップダウンを更新し、アップロードする.
2、ネットがない場合でも、携帯電話にキャッシュされた文章のリストや、アップロードなどを見ることができます.
おおよその効果図:
1、まずMainFragment.javaに対して書き、XListViewに対してドロップダウン・リフレッシュとアップロードを実現する.
@Override
public void onRefresh()
{
new LoadDatasTask().execute(LOAD_REFREASH);
}
@Override
public void onLoadMore()
{
new LoadDatasTask().execute(LOAD_MORE);
}
ドロップダウン・リフレッシュとプルアップ・ロードに対して非同期タスクを呼び出し、操作の識別子を入力しました.次に、クラスを参照してください.
/**
*
*
* @author zhy
*
*/
class LoadDatasTask extends AsyncTask
{
@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
{
@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);
newsItem.setImgLink(imgLink);
newsItem.setDate(date);
newsItem.setNewsType(newstype);
newsItem.setContent(content);
newsItems.add(newsItem);
}
c.close();
db.close();
Logger.e(newsItems.size() + " newsItems.size()");
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return newsItems;
}
}
単一レコード、複数レコード、タイプに応じてレコードを削除するなどの方法が提供される.
最後にネットワークの補助クラスも貼り付けます.
package com.zhy.csdndemo.util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
*
*
* @author Administrator
*
*/
public class NetUtil
{
/**
*
*
* @param context
* @return
*/
public static boolean checkNet(Context context)
{
//
boolean wifiConnected = isWIFIConnected(context);
boolean mobileConnected = isMOBILEConnected(context);
if (wifiConnected == false && mobileConnected == false)
{
// false,
return false;
}
return true;
}
// wifi mobile
/**
* wifi
*/
public static boolean isWIFIConnected(Context context)
{
// Context.CONNECTIVITY_SERVICE).
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (networkInfo != null && networkInfo.isConnected())
{
return true;
}
return false;
}
public static boolean isMOBILEConnected(Context context)
{
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (networkInfo != null && networkInfo.isConnected())
{
return true;
}
return false;
}
}
今日はこれで終わりますが、基本的には、文章の詳細の展示と、ページの画像の保存が残ります.
もしこの文章があなたに役に立つなら、一つにしてもいいです.
ソースコードはここをクリックしてダウンロードします