谷歌电子市场学习笔记第二天之下

一、读取本地缓存

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的源码,

发现该类是一个普通的工具类,如果需要加载多个图片,我们就需要创建多个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;
	}
	//....
}

查看效果图:


全部代码:

http://download.csdn.net/detail/btt2013/9366552


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上善若水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值