- SwipeRefreshLayout+ListView 实现了上拉加载下拉刷新
- AsyncHttpClient实现了数据的加载
- ImageLoader实现了图片的加载与本地缓存跟内存缓存
- SQLite实现了数据的本地缓存
网络数据加载
private static AsyncHttpClient client = new AsyncHttpClient();
public static void get(String url,ResponseHandlerInterface responseHandlerInterface){
client.get(Constant.BASEURL+url,responseHandlerInterface);
}
private void loadFirst() {
isLoading = true;
/**判断网络状态*/
if (HttpUtils.isNetworkConnected(mActivity)){
/**获取的URL*/
HttpUtils.get(Constant.LATESTNEWS, new TextHttpResponseHandler() {
@Override
public void onFailure(int i, Header[] headers, String s, Throwable throwable) {
}
//成功
@Override
public void onSuccess(int i, Header[] headers, String s) {
/**写入SQLite中*/
SQLiteDatabase db = ((MainActivity)mActivity).getCacheDbHelper().getWritableDatabase();
db.execSQL("replace into CacheList(date,json) values (" + Constant.LATEST_COLUMN + ",'" + s + "')");
db.close();
parseLatestJson(s);
}
});
}else {
/**无网络连接时调用*/
SQLiteDatabase db = ((MainActivity)mActivity).getCacheDbHelper().getReadableDatabase();
Cursor cursor = db.rawQuery("select * from CacheList where date = " + Constant.LATEST_COLUMN, null);
if (cursor.moveToFirst()){
String json = cursor.getString(cursor.getColumnIndex("json"));
parseLatestJson(json);
}else {
}
cursor.close();
db.close();
}
}
private void parseLatestJson(String s) {
Gson gson = new Gson();
latest = gson.fromJson(s, Latest.class);
date = latest.getDate();
handler.post(new Runnable() {
@Override
public void run() {
List<StoriesEntity> entities = latest.getStories();
StoriesEntity entity = new StoriesEntity();
entity.setType(Constant.TOPIC);
entity.setTitle("今日热闻");
entity.setTitle(convertDate(date));
entities.add(0, entity);
mAdapter.addList(entities);
isLoading = false;
}
});
}
下拉加载更多数据
从写了SwipeRefreshLayout的下拉方法
public void setSwipeRefreshEnable(boolean enable) {
sr.setEnabled(enable);
}
监听Listview的滑动状态
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
/**
* 滚动时调用
* @param view 视图的滚动
* @param firstVisibleItem 第一个索引
* @param visibleItemCount 可见的Item数量
* @param totalItemCount 适配的数量
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (mListView != null && mListView.getChildCount() > 0) {
Boolean enable = (firstVisibleItem == 0) && (view.getChildAt(firstVisibleItem).getTop() == 0);
((MainActivity) mActivity).setSwipeRefreshEnable(enable);
if (firstVisibleItem + visibleItemCount == totalItemCount && !isLoading) {
/**加载下拉数据*/
loadMore(Constant.BEFORE + date);
}
}
}
});
/**加载数据*/
private void loadMore(String url) {
isLoading = true;
if (HttpUtils.isNetworkConnected(mActivity)){
HttpUtils.get(url, new TextHttpResponseHandler() {
@Override
public void onFailure(int i, Header[] headers, String s, Throwable throwable) {
}
@Override
public void onSuccess(int i, Header[] headers, String s) {
SQLiteDatabase db = ((MainActivity)mActivity).getCacheDbHelper().getWritableDatabase();
db.execSQL("replace into CacheList(date,json) values(" + date + ",' " + s + "')");
db.close();
parseBeforeJson(s);
}
});
}else {
SQLiteDatabase db = ((MainActivity)mActivity).getCacheDbHelper().getReadableDatabase();
Cursor cursor = db.rawQuery("select * from CacheList where date = " + date, null);
if (cursor.moveToFirst()){
String json = cursor.getString(cursor.getColumnIndex("json"));
parseBeforeJson(json);
}else {
cursor.close();
db.close();
}
}
}
private void parseBeforeJson(String responseString) {
Gson gson = new Gson();
before = gson.fromJson(responseString, Before.class);
if (before == null) {
isLoading = false;
return;
}
date = before.getDate();
handler.post(new Runnable() {
@Override
public void run() {
List<StoriesEntity> storiesEntities = before.getStories();
StoriesEntity topic = new StoriesEntity();
topic.setType(Constant.TOPIC);
topic.setTitle(convertDate(date));
storiesEntities.add(0, topic);
mAdapter.addList(storiesEntities);
isLoading = false;
}
});
}
下拉刷新数据
private void initView() {
sr = (SwipeRefreshLayout) findViewById(R.id.sr);
sr.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
replaceFragment();
sr.setRefreshing(false);
}
});
}
图片加载
mImageloader = ImageLoader.getInstance();
options = new DisplayImageOptions.Builder()
.cacheOnDisk(true)
.cacheInMemory(true)
.build();
@Override
public View getView(int i, View convertView, ViewGroup parent) {
ViewHolder viewHolder ;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.main_news_item, parent, false);
viewHolder.tv_topic = (TextView) convertView.findViewById(R.id.tv_date);
viewHolder.tv_title = (TextView) convertView.findViewById(R.id.tv_title);
viewHolder.iv_title = (ImageView) convertView.findViewById(R.id.tv_img);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
StoriesEntity entity = entities.get(i);
if (entity.getType() == Constant.TOPIC) {
((FrameLayout) viewHolder.tv_topic.getParent()).setBackgroundColor(Color.TRANSPARENT);
viewHolder.tv_title.setVisibility(View.GONE);
viewHolder.iv_title.setVisibility(View.GONE);
viewHolder.tv_topic.setVisibility(View.VISIBLE);
viewHolder.tv_topic.setText(entity.getTitle());
} else {
//样式设置
((FrameLayout) viewHolder.tv_topic.getParent()).setBackgroundResource(isLight ? R.drawable.item_background_selector_light : R.drawable.item_background_selector_dark);
viewHolder.tv_topic.setVisibility(View.GONE);
viewHolder.tv_title.setVisibility(View.VISIBLE);
viewHolder.iv_title.setVisibility(View.VISIBLE);
viewHolder.tv_title.setText(entity.getTitle());
/**加载图片*/
mImageloader.displayImage(entity.getImages().get(0), viewHolder.iv_title, options);
}
return convertView;
}