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に対してドロップダウン・リフレッシュとアップロードを実現する.
	@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;
	}
}

今日はこれで終わりますが、基本的には、文章の詳細の展示と、ページの画像の保存が残ります.
もしこの文章があなたに役に立つなら、一つにしてもいいです.
ソースコードはここをクリックしてダウンロードします