一、读取本地缓存
HomeProtocol.java
package com.xbmu.google.protocol;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import com.lidroid.xutils.util.IOUtils;
import com.xbmu.google.http.HttpHelper;
import com.xbmu.google.http.HttpHelper.HttpResult;
import com.xbmu.google.tools.FileUtils;
public class HomeProtocol {
public void load(int index){
String json = loadLocal(index);
if(json==null){
json = loadServer(index);
if(json!=null){
saveLocal(json,index);
}
}
if(json!=null){
parseJson(json);
}
}
//1.把整个json文件写到一个本地文件中
//2.把每条数据都摘出来存到数据库中
private void parseJson(String json) {
// TODO Auto-generated method stub
}
/**
* 将json文件保存到本地
* @param json
* @param index
*/
private void saveLocal(String json, int index) {
BufferedWriter bw = null;
try {
File dir = FileUtils.getCacheDir();
//在第一行写一个过期时间
File file = new File(dir, "home_"+index);// /mnt/sdcard/googlePlay/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 (IOException e) {
e.printStackTrace();
} finally{
IOUtils.closeQuietly(bw);
}
}
private String loadServer(int index) {
HttpResult httpResult = HttpHelper.get(HttpHelper.URL+"home"+"?index="+index);// http://127.0.0.1:8090/home?index=index
String json = httpResult.getString();
return json;
}
/**
* 加载本地json文件(读取本地文件)
* @param index
* @return
*/
private String loadLocal(int index) {
//如果发现文件已经过期了,就不要再去复用缓存了
File dir = FileUtils.getCacheDir();//获取缓存所在的文件夹
File file = new File(dir, "home_"+index);
try {
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
Long outOfDate = Long.valueOf(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 (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
二、Json解析
见到大括号 就用JsonObject ,见到中括号就是JsonArray
HomeProtocol.java
package com.xbmu.google.protocol;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.lidroid.xutils.util.IOUtils;
import com.xbmu.google.domain.AppInfo;
import com.xbmu.google.http.HttpHelper;
import com.xbmu.google.http.HttpHelper.HttpResult;
import com.xbmu.google.tools.FileUtils;
public class HomeProtocol {
public List<AppInfo> 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;
}
}
//1.把整个json文件写到一个本地文件中
//2.把每条数据都摘出来存到数据库中
private List<AppInfo> parseJson(String json) {
List<AppInfo> appInfos = new ArrayList<AppInfo>();
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray jsonArray = jsonObject.getJSONArray("list");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
Long id = object.getLong("id");
String name = object.getString("name");
String packageName = object.getString("packageName");
String iconUrl = object.getString("iconUrl");
float stars = Float.valueOf(object.getString("stars"));
Long size = object.getLong("size");
String downloadUrl = object.getString("downloadUrl");
String des = object.getString("des");
AppInfo appInfo = new AppInfo(id, name, packageName, iconUrl, stars, size, downloadUrl, des);
appInfos.add(appInfo);
}
return appInfos;
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
//.....
}
AppInfo.java
package com.xbmu.google.domain;
public class AppInfo {
private Long id;
private String name;
private String packageName;
private String iconUrl;
private float stars;
private Long size;
private String downloadUrl;
private String des;
public AppInfo() {
super();
// TODO Auto-generated constructor stub
}
public AppInfo(Long id, String name, String packageName, String iconUrl,
float stars, Long size, String downloadUrl, String des) {
super();
this.id = id;
this.name = name;
this.packageName = packageName;
this.iconUrl = iconUrl;
this.stars = stars;
this.size = size;
this.downloadUrl = downloadUrl;
this.des = des;
}
//.....
}
三、布局的搭建
效果图:
item_app.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 凡是以layout开头的属性 其实都是经过父容器批准才能生效 因为在listView 中 layout_height 无论写什么属性值 都是包裹内容 -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="113dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:background="@drawable/list_item_bg" >
<RelativeLayout
android:id="@+id/item_top"
android:layout_width="match_parent"
android:layout_height="72dp" >
<ImageView
android:id="@+id/item_icon"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_centerVertical="true"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:src="@drawable/ic_default" />
<RelativeLayout
android:id="@+id/item_action"
android:layout_width="70dp"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:gravity="center" >
<FrameLayout
android:id="@+id/action_progress"
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_centerHorizontal="true"
android:background="@drawable/ic_download" />
<TextView
android:id="@+id/action_txt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/action_progress"
android:layout_marginTop="5dp"
android:ellipsize="end"
android:gravity="center"
android:singleLine="true"
android:textColor="#ff7a7a7a"
android:textSize="12dp"
android:text="下载" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/item_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/item_action"
android:layout_toRightOf="@id/item_icon" >
<TextView
android:id="@+id/item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:textColor="#ff333333"
android:textSize="16dp" />
<RatingBar
android:id="@+id/item_rating"
android:layout_width="wrap_content"
android:layout_height="14dp"
android:layout_below="@id/item_title"
android:layout_marginBottom="2dp"
android:layout_marginTop="2dp"
android:isIndicator="true"
android:progressDrawable="@drawable/process_ratingbar"
android:rating="2.5" />
<TextView
android:id="@+id/item_size"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/item_rating"
android:singleLine="true"
android:textColor="#ff7a7a7a"
android:textSize="12dp" />
</RelativeLayout>
</RelativeLayout>
<View
android:id="@+id/item_divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@id/item_top"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:background="@color/item_divider" />
<TextView
android:id="@+id/item_bottom"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_below="@id/item_divider"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:singleLine="true"
android:textColor="#ff717171"
android:textSize="14dp" />
</RelativeLayout>
</FrameLayout>
list_item_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="200">
<item android:drawable="@drawable/list_item_bg_pressed" android:state_pressed="true"></item>
<item android:drawable="@drawable/list_item_bg_normal"></item>
</selector>
RatingBar
和水平进度条非常相似
process_ratingbar.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+android:id/background"
android:drawable="@drawable/rating_small_empty"/>
<item
android:id="@+android:id/secondaryProgress"
android:drawable="@drawable/rating_small_half"/>
<item
android:id="@+android:id/progress"
android:drawable="@drawable/rating_small_full"/>
</layer-list>
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="indicatorcolor">#ff0084ff</color>
<color name="item_divider">#ffd7d7d7</color>
<color name="txt_title">#333333</color>
</resources>
四、加载界面&BitMapUtils的用法
FileUtils.java
package com.xbmu.google.tools;
import java.io.File;
import android.os.Environment;
public class FileUtils {
public static final String CACHE = "cache";
public static final String ROOT = "GooglePlay";
public static final String ICON = "icon";
/**
* 获取缓存图片路径
* @return
*/
public static File getIconDir() {
return getDir(ICON);
}
/**
* 获取缓存路径(里面缓存了json文件)
* @return
*/
public static File getCacheDir() {
return getDir(CACHE);
}
public static File getDir(String str) {
StringBuilder path = new StringBuilder();
if (isSDAvailable()) {
path.append(Environment.getExternalStorageDirectory()
.getAbsolutePath());// /mnt/sdcard
path.append(File.separator);// '/'
path.append(ROOT);// /mnt/sdcard/GooglePlay
path.append(File.separator);
path.append(str);// /mnt/sdcard/GooglePlay/cache
} else {
// sd卡不可用
File filesDir = UiUtils.getContext().getCacheDir();// cache
path.append(filesDir.getAbsolutePath());// /data/data/com.xbmu.google/cache
path.append(File.separator);
path.append(str);
}
File file = new File(path.toString());
if (!file.exists() || !file.isDirectory()) {
file.mkdirs();// 创建文件夹
}
return file;
}
/**
* 判断sd卡是否可用
*
* @return
*/
private static boolean isSDAvailable() {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return true;
}
return false;
}
}
五、加载服务器图片
三级缓存:
网络 本地 内存
加载内存 lru 算法
在从网络中加载图片的时候,我们借用xutils框架中的BitmapUtils.java,但是通过查看
BitmapUtils.java的源码,
网络 本地 内存
加载内存 lru 算法
发现该类是一个普通的工具类,如果需要加载多个图片,我们就需要创建多个BitmapUtils对象,这样对内存的消耗特别大,因此我们必须借助BitmapHelpe.java。参考xutils框架中的示列代码:
BitmapHelp.java
package com.xbmu.google.tools;
import com.lidroid.xutils.BitmapUtils;
public class BitmapHelp {
private BitmapHelp() {
}
private static BitmapUtils bitmapUtils;
/**
* BitmapUtils不是单例的 根据需要重载多个获取实例的方法
*
* @param appContext
* application context
* @return
*/
public static BitmapUtils getBitmapUtils() {
if (bitmapUtils == null) {
/**
* context:上下文
* diskCachePath:缓存图片的路径
* memoryCachePercent:加载图片,最多消耗多少比例的内存 0.05f-0.8f
*/
bitmapUtils = new BitmapUtils(UiUtils.getContext(), FileUtils
.getIconDir().getAbsolutePath(), 0.5f);
}
return bitmapUtils;
}
}
HomeFragment.java
package com.xbmu.google.fragment;
import java.util.List;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RatingBar;
import android.widget.TextView;
import com.lidroid.xutils.BitmapUtils;
import com.lidroid.xutils.bitmap.PauseOnScrollListener;
import com.xbmu.google.R;
import com.xbmu.google.domain.AppInfo;
import com.xbmu.google.http.HttpHelper;
import com.xbmu.google.protocol.HomeProtocol;
import com.xbmu.google.tools.BitmapHelp;
import com.xbmu.google.tools.UiUtils;
import com.xbmu.google.view.LoadingPage.LoadResult;
public class HomeFragment extends BaseFragment {
private List<AppInfo> mDatas;
private BitmapUtils bitmapUtils;
// 当Fragment挂载的activity创建的时候调用
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
show();
}
@Override
protected View createSuccessView() {
ListView listView = new ListView(UiUtils.getContext());
listView.setAdapter(new HomeAdapter());
bitmapUtils = BitmapHelp.getBitmapUtils();
//ListView有三种滑动状态:静止,慢慢滑动,飞速滑动
// 第二个参数 慢慢滑动的时候是否加载图片 false 加载 true 不加载
// 第三个参数 飞速滑动的时候是否加载图片 true 不加载
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils,
false, true));
bitmapUtils.configDefaultLoadingImage(R.drawable.ic_default); // 设置如果图片加载中显示的图片
bitmapUtils.configDefaultLoadFailedImage(R.drawable.ic_default);// 加载失败显示的图片
return listView;
}
private class HomeAdapter extends BaseAdapter {
@Override
public int getCount() {
return mDatas.size();
}
@Override
public Object getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
ViewHolder holder;
if (convertView != null) {
view = convertView;
holder = (ViewHolder) view.getTag();
} else {
view = UiUtils.inflate(R.layout.item_app);
holder = new ViewHolder();
holder.item_icon = (ImageView) view
.findViewById(R.id.item_icon);
holder.item_title = (TextView) view
.findViewById(R.id.item_title);
holder.item_rating = (RatingBar) view
.findViewById(R.id.item_rating);
holder.item_size = (TextView) view.findViewById(R.id.item_size);
holder.item_bottom = (TextView) view
.findViewById(R.id.item_bottom);
view.setTag(holder);
}
AppInfo appInfo = mDatas.get(position);
String iconUrl = appInfo.getIconUrl();// http://127.0.0.1:8090/image?name=app/com.youyuan.yyhl/icon.jpg
BitmapUtils bitmapUtils = BitmapHelp.getBitmapUtils();
// 显示图片
bitmapUtils.display(holder.item_icon, HttpHelper.URL
+ "image?name=" + iconUrl);
holder.item_title.setText(appInfo.getName());
holder.item_rating.setRating(appInfo.getStars());
holder.item_size.setText(String.valueOf(appInfo.getSize()));
holder.item_bottom.setText(appInfo.getDes());
return view;
}
}
static class ViewHolder {
ImageView item_icon;
TextView item_title, item_size, item_bottom;
RatingBar item_rating;
}
@Override
protected LoadResult load() {
HomeProtocol protocol = new HomeProtocol();
mDatas = protocol.load(0);
return checkData(mDatas);
}
}
运行效果图:
六、将HomeProtocol.java协议类抽取为BaseProtocol.java &专题界面
BaseProtocol.java
package com.xbmu.google.protocol;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import com.lidroid.xutils.util.IOUtils;
import com.xbmu.google.http.HttpHelper;
import com.xbmu.google.http.HttpHelper.HttpResult;
import com.xbmu.google.tools.FileUtils;
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;
}
}
protected abstract T parseJson(String json);
/**
* 将json文件保存到本地
* @param json
* @param index
*/
private void saveLocal(String json, int index) {
BufferedWriter bw = null;
try {
File dir = FileUtils.getCacheDir();
//在第一行写一个过期时间
File file = new File(dir, getKey()+"_"+index);// /mnt/sdcard/googlePlay/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 (IOException e) {
e.printStackTrace();
} finally{
IOUtils.closeQuietly(bw);
}
}
protected abstract String getKey();
private String loadServer(int index) {
HttpResult httpResult = HttpHelper.get(HttpHelper.URL+getKey()+"?index="+index);// http://127.0.0.1:8090/home?index=index
if(httpResult!=null){
String json = httpResult.getString();
return json;
}
return null;
}
/**
* 加载本地json文件(读取本地文件)
* @param index
* @return
*/
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.valueOf(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 (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
HomeProtocol.java
package com.xbmu.google.protocol;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.xbmu.google.domain.AppInfo;
public class HomeProtocol extends BaseProtocol<List<AppInfo>>{
@Override
protected List<AppInfo> parseJson(String json) {
List<AppInfo> appInfos = new ArrayList<AppInfo>();
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray jsonArray = jsonObject.getJSONArray("list");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
Long id = object.getLong("id");
String name = object.getString("name");
String packageName = object.getString("packageName");
String iconUrl = object.getString("iconUrl");
float stars = Float.valueOf(object.getString("stars"));
Long size = object.getLong("size");
String downloadUrl = object.getString("downloadUrl");
String des = object.getString("des");
AppInfo appInfo = new AppInfo(id, name, packageName, iconUrl, stars, size, downloadUrl, des);
appInfos.add(appInfo);
}
return appInfos;
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
@Override
protected String getKey() {
return "home";
}
}
SubjectInfo.java
package com.xbmu.google.domain;
public class SubjectInfo {
private String des;
private String url;
//...
}
SubjectProtocol.java
package com.xbmu.google.protocol;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.xbmu.google.domain.SubjectInfo;
public class SubjectProtocol extends BaseProtocol<List<SubjectInfo>>{
@Override
protected List<SubjectInfo> parseJson(String json) {
List<SubjectInfo> subjectInfos = new ArrayList<SubjectInfo>();
try {
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject =jsonArray.getJSONObject(i);
String des = jsonObject.getString("des");
String url = jsonObject.getString("url");
SubjectInfo subjectInfo = new SubjectInfo(des, url);
subjectInfos.add(subjectInfo);
}
return subjectInfos;
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
@Override
protected String getKey() {
return "subject";
}
}
item_subject.java
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="9dip"
android:layout_marginRight="9dip"
android:background="@drawable/list_item_bg" >
<ImageView
android:id="@+id/item_icon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:src="@drawable/ic_default"
android:padding="5dp"/>
<TextView
android:id="@+id/item_txt"
style="@style/TitleStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_below="@id/item_icon"
android:gravity="center_vertical"
android:paddingBottom="5dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:singleLine="true" />
</RelativeLayout>
</FrameLayout>
styles.xml
<resources>
<!--
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Light">
<!--
Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
backward-compatibility can go here.
-->
</style>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>
<style name="TitleStyle">
<item name="android:textColor">@color/txt_title</item>
<item name="android:textSize">@dimen/list_item_title_size</item>
<item name="android:ellipsize">end</item>
<item name="android:singleLine">true</item>
</style>
</resources>
dimens.xml
<resources>
<dimen name="list_item_title_size">16dp</dimen>
</resources>
SubjectFragment.java
package com.xbmu.google.fragment;
import java.util.List;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.lidroid.xutils.BitmapUtils;
import com.xbmu.google.R;
import com.xbmu.google.domain.SubjectInfo;
import com.xbmu.google.http.HttpHelper;
import com.xbmu.google.protocol.SubjectProtocol;
import com.xbmu.google.tools.BitmapHelp;
import com.xbmu.google.tools.UiUtils;
import com.xbmu.google.view.LoadingPage.LoadResult;
public class SubjectFragment extends BaseFragment {
private List<SubjectInfo> mDatas;
@Override
protected View createSuccessView() {
ListView listView = new ListView(UiUtils.getContext());
listView.setAdapter(new SubjectAdapter());
return listView;
}
private class SubjectAdapter extends BaseAdapter{
@Override
public int getCount() {
return mDatas.size();
}
@Override
public Object getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
ViewHolder holder;
if(convertView!=null){
view = convertView;
holder = (ViewHolder) view.getTag();
}else{
view = UiUtils.inflate(R.layout.item_subject);
holder = new ViewHolder();
holder.item_icon = (ImageView) view.findViewById(R.id.item_icon);
holder.item_txt = (TextView) view.findViewById(R.id.item_txt);
view.setTag(holder);
}
SubjectInfo subjectInfo = mDatas.get(position);
String iconUrl = subjectInfo.getUrl();
BitmapUtils bitmapUtils = BitmapHelp.getBitmapUtils();
bitmapUtils.display(holder.item_icon,HttpHelper.URL+"image?name="+iconUrl);
holder.item_txt.setText(subjectInfo.getDes());
return view;
}
}
static class ViewHolder{
ImageView item_icon;
TextView item_txt;
}
@Override
protected LoadResult load() {
SubjectProtocol protocol = new SubjectProtocol();
mDatas = protocol.load(0);
return checkData(mDatas);
}
}
运行效果图:
七、抽取BaseListView.java
setSelector 点击显示的颜色
setCacheColorHint 拖拽的颜色
setDivider 每个条目的间隔 的分割线
运行程序后,当我们将ListView中的item按小去的时候,背景色为蓝色,不好看
由于ListView控件在这个项目中应用很广泛,所以将系统 原有的控件ListView重新定义下:
BaseListView.java
package com.xbmu.google.view;
import com.xbmu.google.R;
import com.xbmu.google.tools.UiUtils;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;
public class BaseListView extends ListView {
public BaseListView(Context context) {
super(context);
init();
}
public BaseListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public BaseListView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
// setSelector 点击显示的颜色
// setCacheColorHint 拖拽的颜色
// setDivider 每个条目的间隔 的分割线
this.setSelector(R.drawable.nothing); // 什么都没有
this.setCacheColorHint(R.drawable.nothing);
this.setDivider(UiUtils.getDrawalbe(R.drawable.nothing));
}
}
UiUtils.java
package com.xbmu.google.tools;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.view.View;
import com.xbmu.google.application.BaseApplication;
public class UiUtils {
/**
* 获取到字符数组
* @param tabNames 字符数组的id
*/
public static String[] getStringArray(int tabNames) {
return getResource().getStringArray(tabNames);
}
public static Resources getResource() {
return BaseApplication.getmContext().getResources();
}
public static Context getContext(){
return BaseApplication.getmContext();
}
public static void runOnUiThread(Runnable runnable){
//在主线程运行
if(android.os.Process.myTid()==BaseApplication.getMainTid()){
runnable.run();
}else{
//获取Handler
BaseApplication.getHandler().post(runnable);
}
}
/** dip转换px */
public static int dip2px(int dip) {
final float scale = getResource().getDisplayMetrics().density;
return (int) (dip * scale + 0.5f);
}
/** pxz转换dip */
public static int px2dip(int px) {
final float scale = getResource().getDisplayMetrics().density;
return (int) (px / scale + 0.5f);
}
public static View inflate(int id) {
return View.inflate(getContext(), id, null);
}
public static Drawable getDrawalbe(int id) {
return getResource().getDrawable(id);
}
}
HomeFragment.java
package com.xbmu.google.fragment;
import java.util.List;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;
import com.lidroid.xutils.BitmapUtils;
import com.lidroid.xutils.bitmap.PauseOnScrollListener;
import com.xbmu.google.R;
import com.xbmu.google.domain.AppInfo;
import com.xbmu.google.http.HttpHelper;
import com.xbmu.google.protocol.HomeProtocol;
import com.xbmu.google.tools.BitmapHelp;
import com.xbmu.google.tools.UiUtils;
import com.xbmu.google.view.BaseListView;
import com.xbmu.google.view.LoadingPage.LoadResult;
public class HomeFragment extends BaseFragment {
private List<AppInfo> mDatas;
private BitmapUtils bitmapUtils;
// 当Fragment挂载的activity创建的时候调用
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
show();
}
@Override
protected View createSuccessView() {
BaseListView listView = new BaseListView(UiUtils.getContext());
listView.setAdapter(new HomeAdapter());
bitmapUtils = BitmapHelp.getBitmapUtils();
//ListView有三种滑动状态:静止,慢慢滑动,飞速滑动
// 第二个参数 慢慢滑动的时候是否加载图片 false 加载 true 不加载
// 第三个参数 飞速滑动的时候是否加载图片 true 不加载
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils,
false, true));
bitmapUtils.configDefaultLoadingImage(R.drawable.ic_default); // 设置如果图片加载中显示的图片
bitmapUtils.configDefaultLoadFailedImage(R.drawable.ic_default);// 加载失败显示的图片
return listView;
}
//....
}
查看效果图:
全部代码: