App的界面的实现和HomeFragment,其中的javaBean都是一样的,因此ListView的实现ViewHolder的实现,和AppProtocal的解析也是一样的。
AppFragment.java
package com.ldw.market.fragment;
import java.util.List;
import android.text.format.Formatter;
import android.view.View;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;
import com.ldw.market.R;
import com.ldw.market.Adapter.DefaultAdapter;
import com.ldw.market.domain.AppInfo;
import com.ldw.market.holder.BaseHolder;
import com.ldw.market.http.HttpHelper;
import com.ldw.market.protocol.AppProtocol;
import com.ldw.market.utils.UiUtils;
import com.ldw.market.view.BaseListView;
import com.lidroid.xutils.bitmap.PauseOnScrollListener;
public class AppFragment extends BaseFragment {
List<AppInfo> datas;
//加载成功,显示ListView
@Override
public View createSuccessView() {
BaseListView listView=new BaseListView(UiUtils.getContext());
listView.setAdapter(new AppAdapter(datas));
// 第二个参数 慢慢滑动的时候是否加载图片 false 加载 true 不加载
// 第三个参数 飞速滑动的时候是否加载图片 true 不加载
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
bitmapUtils.configDefaultLoadingImage(R.drawable.ic_default); // 设置如果图片加载中显示的图片
bitmapUtils.configDefaultLoadFailedImage(R.drawable.ic_default);// 加载失败显示的图片
return listView;
}
public class AppAdapter extends DefaultAdapter<AppInfo>{
public AppAdapter(List<AppInfo> datas) {
super(datas);
// TODO Auto-generated constructor stub
}
@Override
protected BaseHolder<AppInfo> getHolder() {
return new ViewHolder();
}
}
static class ViewHolder extends BaseHolder<AppInfo>{
ImageView item_icon;
TextView item_title,item_size,item_bottom;
RatingBar item_rating;
//更新界面
@Override
public void refreshView(AppInfo data){
this.item_title.setText(data.getName());// 设置应用程序的名字
String size = Formatter.formatFileSize(UiUtils.getContext(), data.getSize());
this.item_size.setText(size);
this.item_bottom.setText(data.getDes());
float stars = data.getStars();
this.item_rating.setRating(stars); // 设置ratingBar的值
String iconUrl = data.getIconUrl(); //这个地址不全,需要加上apache地址"iconUrl": "app/com.youyuan.yyhl/icon.jpg",
//http://127.0.0.1:8090/image?name=app/com.youyuan.yyhl/icon.jpg
//第一个参数是显示图片的控件,第二个参数是显示图片的url
bitmapUtils.display(this.item_icon, HttpHelper.URL+"image?name="+iconUrl);
// 显示图片的控件
//bitmapUtils.display(holder.item_icon, HttpHelper.URL+"image?name="+iconUrl);
}
@Override
public View initView() {
View contentView = View.inflate(UiUtils.getContext(), R.layout.item_app, null);
this.item_icon = (ImageView) contentView.findViewById(R.id.item_icon);
this.item_title = (TextView) contentView.findViewById(R.id.item_title);
this.item_size = (TextView) contentView.findViewById(R.id.item_size);
this.item_bottom = (TextView) contentView.findViewById(R.id.item_bottom);
this.item_rating = (RatingBar) contentView.findViewById(R.id.item_rating);
return contentView;
}
}
/*
* 请求服务器获取服务器的数据(non-Javadoc)
* @see com.ldw.market.fragment.BaseFragment#load()
*/
@Override
protected LoadResult load() {
AppProtocol protocol = new AppProtocol();
datas = protocol.load(0);
return checkData(datas);
}
}
AppProtocol.java
package com.ldw.market.protocol;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.ldw.market.domain.AppInfo;
public class AppProtocol extends BaseProtocol<List<AppInfo>>{
@Override
public List<AppInfo> parseJson(String json) {
List<AppInfo> appInfos = new ArrayList<AppInfo>();
//获取到中括号的内容
try {
JSONArray jsonArray = new JSONArray(json);
for(int i = 0; i< jsonArray.length();i ++){
//获取到array里面的Object
JSONObject jsonObj = jsonArray.getJSONObject(i);
//解析Object里面的条目
long id = jsonObj.getLong("id");
String name = jsonObj.getString("name");
String packageName = jsonObj.getString("packageName");
String iconUrl = jsonObj.getString("iconUrl");
float stars = Float.parseFloat(jsonObj.getString("stars"));
long size = jsonObj.getLong("size");
String downloadUrl = jsonObj.getString("downloadUrl");
String des = jsonObj.getString("des");
//构造函数,创建一个appInfo
AppInfo appInfo = new AppInfo(id, name, packageName, iconUrl,
stars, size, downloadUrl, des);
//往集合中添加对象
appInfos.add(appInfo);
}
return appInfos;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
@Override
public String getKey() {
// TODO Auto-generated method stub
return "app";
}
}
BaseProtocal.java
package com.ldw.market.protocol;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.StringWriter;
import com.ldw.market.http.HttpHelper;
import com.ldw.market.http.HttpHelper.HttpResult;
import com.ldw.market.utils.FileUtils;
import com.lidroid.xutils.util.IOUtils;
public abstract class BaseProtocol<T> {
public T load(int index) {
// 加载本地数据
String json = loadLocal(index);
if (json == null) {
// 请求服务器
json = loadServer(index);
if (json != null) {
saveLocal(json, index);
}
}
if (json != null) {
return parseJson(json);
} else {
return null;
}
}
//从服务器请求json数据
private String loadServer(int index) {
//请求地址http://127.0.0.1:8090/home?index=1
HttpResult httpResult = HttpHelper.get(HttpHelper.URL + getKey()
+ "?index=" + index);
//得到结果
String json = httpResult.getString();
//System.out.println(json);
return json;
}
//将json保存在本地:方法1把整个json文件写到一个本地文件中,方法2吧每条数据都摘出来保存在数据库中
private void saveLocal(String json, int index) {
//创建一个buffer
BufferedWriter bw = null;
try {
File dir=FileUtils.getCacheDir();
//创建一个文件
File file = new File(dir, getKey() + "_" + index); // /mnt/sdcard/market/cache/home_0
FileWriter fw = new FileWriter(file);
bw = new BufferedWriter(fw);
//在第一行写一个过期时间
bw.write(System.currentTimeMillis() + 1000 * 100 + "");
bw.newLine();// 换行
bw.write(json);// 把整个json文件保存起来
bw.flush();
bw.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
IOUtils.closeQuietly(bw);
}
}
//加载本地保存的数据
private String loadLocal(int index) {
// 如果发现时间过期了,就不用本地的缓存
File dir=FileUtils.getCacheDir();// 获取缓存所在的文件夹
//得到缓存文件
File file = new File(dir, getKey() + "_" + index);
try {
FileReader fr=new FileReader(file);
BufferedReader br=new BufferedReader(fr);
//获取过期时间
long outOfDate = Long.parseLong(br.readLine());
//判断是否过期,
if(System.currentTimeMillis()>outOfDate){
return null;
}else{
String str=null;
StringWriter sw=new StringWriter();
while((str=br.readLine())!=null){
sw.write(str);
}
return sw.toString();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 解析json
* @param json
* @return
*/
public abstract T parseJson(String json);
/**
* 说明了关键字home,subject....
*/
public abstract String getKey();
}
BaseHolder.java
package com.ldw.market.holder;
import android.view.View;
import com.ldw.market.utils.BitmapHelper;
import com.lidroid.xutils.BitmapUtils;
/*
* ViewHolder共性的抽取
*/
public abstract class BaseHolder<Data> {
private View contentView;
private Data data;
protected BitmapUtils bitmapUtils;
//构造方法
public BaseHolder(){
bitmapUtils = BitmapHelper.getBitmapUtils();
contentView=initView();
contentView.setTag(this);
}
/** 创建界面*/
public abstract View initView();
public View getContentView() {
return contentView;
}
public void setData(Data data){
this.data=data;
refreshView(data);
}
/** 根据数据刷新界面*/
public abstract void refreshView(Data data);
}