先上效果图:
这是个ListView:
layout是:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:tag="itemview" android:orientation="horizontal"
android:background="@drawable/list_item_bg">
<ImageView android:id="@+id/ivItemPortrait"
android:layout_marginLeft="5dip" android:layout_marginTop="5dp"
android:layout_width="50dp" android:layout_height="50dp"
android:saveEnabled="true" android:src="@drawable/portrait" android:adjustViewBounds="true"/> //头像的图片
<LinearLayout android:id="@+id/lyRightLayout"
android:layout_height="wrap_content" android:layout_width="fill_parent"
android:orientation="vertical" android:layout_margin="5dip">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginRight="3dip"
android:orientation="horizontal">
<TextView
android:text=""
android:id="@+id/tvItemName"
android:textColor="#000"
android:textSize="15sp"
android:paddingLeft="5dip"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> //这个是名字
<RelativeLayout //这个是名字右侧的Layout,包括时间和定位信息
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginRight="3dip"
android:gravity="right"
android:layout_weight="1">
<TextView android:text="" android:id="@+id/tvItemDate"
android:textColor="#666666" android:layout_marginLeft="3dip"
android:textSize="12sp" android:layout_gravity="right"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentRight="true" />
<ImageView android:id="@+id/ivItemPic"
android:layout_marginTop="3dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_toLeftOf="@id/tvItemDate"
android:layout_alignTop="@id/tvItemDate" android:src="@drawable/pic"
android:saveEnabled="false" android:visibility="gone" />
<ImageView android:id="@+id/ivItemGps"
android:layout_marginTop="3dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_toLeftOf="@id/ivItemPic"
android:layout_alignTop="@id/tvItemDate" android:src="@drawable/location_icon"
android:saveEnabled="false" android:visibility="gone" />
</RelativeLayout>
</LinearLayout>
<TextView android:text="" android:id="@+id/tvItemContent" //这个是内容的信息
android:textColor="#414951"
android:layout_marginTop="8dip" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="5dip" android:paddingRight="5dip"
android:lineSpacingExtra="4px"/>
<RelativeLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:gravity="center_vertical">
<ImageView android:id="@+id/tweet_upload_pic1"
android:scaleType="centerInside" android:layout_width="@integer/preview_pic_size"
android:layout_height="@integer/preview_pic_size"
android:layout_marginLeft="5dp" android:layout_marginRight="5dp"
android:visibility="gone" android:src="@drawable/preview_pic_loading"
android:layout_marginTop="5dp" android:layout_marginBottom="5dp" /> //这个发送方的图
</RelativeLayout>
<LinearLayout android:id="@+id/subLayout"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="vertical" android:layout_marginBottom="4dp"
android:background="@drawable/popup" android:visibility="gone">
<TextView android:text="" android:id="@+id/tvItemSubContent"
android:textColor="#666666"
android:layout_marginTop="3dip" android:layout_marginBottom="3dip"
android:layout_width="fill_parent" android:layout_height="wrap_content" android:lineSpacingExtra="4px"/>
<RelativeLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:gravity="center_vertical" android:paddingBottom="10dp">
<ImageView android:id="@+id/tweet_upload_pic2"
android:scaleType="centerInside" android:layout_width="@integer/preview_pic_size"
android:layout_height="@integer/preview_pic_size"
android:layout_marginLeft="5dp" android:layout_marginRight="5dp"
android:visibility="gone" android:src="@drawable/preview_pic_loading"
android:layout_marginTop="5dp" android:layout_marginBottom="5dp" /> <pre name="code" class="html"> //这个是转发的图
</RelativeLayout></LinearLayout><LinearLayout android:layout_width="fill_parent"android:layout_height="wrap_content" android:orientation="horizontal"><TextView android:id="@+id/tweet_form" android:textSize="12.0sp" android:textColor="#ff7d7d7d"android:layout_width="wrap_content" android:layout_height="wrap_content"android:layout_weight="1" android:paddingLeft="5dip"/>
//这个是最下方的小图标<LinearLayout android:layout_width="wrap_content"android:layout_height="wrap_content" android:orientation="horizontal"android:gravity="right|center_vertical" ><ImageView android:id="@+id/tweet_redirect_pic" android:layout_width="wrap_content"android:layout_height="wrap_content" android:paddingLeft="10.0dip"android:visibility="gone" android:src="@drawable/redirect_icon" /><TextView android:id="@+id/tweet_redirect"android:textSize="12.0sp" android:textColor="#a4b7d6" android:layout_width="wrap_content"android:layout_height="wrap_content" android:visibility="gone" android:paddingLeft="2dip"/><ImageView android:id="@+id/tweet_comment_pic" android:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="10.0dip"android:visibility="gone" android:src="@drawable/comment_icon" /><TextView android:id="@+id/tweet_comment" android:textSize="12.0sp"android:textColor="#a4b7d6" android:layout_width="wrap_content"android:visibility="gone" android:paddingLeft="2dip"android:layout_height="wrap_content" android:paddingRight="5dp"/></LinearLayout></LinearLayout></LinearLayout></LinearLayout>
逻辑是:
1.检查本地是否有缓存,如果有直接转化为List,作为ListView的数据
2.如果没有数据,就从服务器把数据download下来存在本地,并进行解析
3.写adapter去加载这些数据
下面来说说如何加载列表中的小图片
在内存里new一个:
public static Map<String, Bitmap> mPortraitCacheMap = new HashMap<String, Bitmap>();
if (mBlog.portrait != null) {
new LoadPortraitTask().execute(mBlog.portrait, mCacheDir,
this.parent, mBlog);
}
Bitmap bm = Utils.mPortraitCacheMap.get(mBlog.portrait);
if (bm != null && !bm.isRecycled()) {
mPortrait.setVisibility(View.INVISIBLE);
mPortrait.setImageBitmap(bm);
mPortrait.setVisibility(View.VISIBLE);
return;
}
private class LoadPortraitTask extends AsyncTask<Object, Void, Object[]> {
protected void onPreExecute() {
}
protected Object[] doInBackground(Object... args) {
String portraitUrl = (String) args[0];
// String cacheDir = TextUtils.isEmpty(mSdFileDir)? mCacheDir : mSdFileDir;
ListView listView = (ListView) args[2];
MBlog mBlog = (MBlog) args[3];
Object[] objs = new Object[2];
objs[0] = mBlog.portrait;
Bitmap round = null;
//将图片下载下来保存在sd卡上
objs[1] = Utils.getPortraitBitmap(portraitUrl, mCacheDir, listView.getContext(),
mBlog, true, Constants.PORTRAIT_DIR_SUFFIX);
return objs;
}
protected void onProgressUpdate(Void... unused) {
}
protected void onPostExecute(Object[] ret) {
String url = (String) ret[0];
Bitmap b = (Bitmap) ret[1];
if (!mBlog.portrait.equals(url))
return;
if (b != null && !b.isRecycled()) {
mPortrait.setVisibility(View.INVISIBLE);
mPortrait.setImageBitmap(b);
mPortrait.setVisibility(View.VISIBLE);
} else {
mPortrait.setVisibility(View.INVISIBLE);
mPortrait.setImageBitmap(getDefaultPortrait());
mPortrait.setVisibility(View.VISIBLE);
}
}
}
public static Bitmap getPortraitBitmap(String portraitUrl,
String cacheDir, Context ctx, MBlog mBlog, boolean bRound, String suffix) {
synchronized (lock) {
final String sdDir = Utils.getSDPath();
final String saveDir = TextUtils.isEmpty(sdDir)? cacheDir : sdDir + suffix;
String file = null;
Context context = ctx;
//如果图片已经存在本地,那就直接加载就好了
if (isInCacheMap(portraitUrl, suffix)) {
Bitmap bm = mPortraitCacheMap.get(portraitUrl);
if (bm == null || bm.isRecycled()) {
mPortraitCacheMap.remove(portraitUrl);
file = Utils.checkCache(saveDir, portraitUrl);
return loadFromFile(context, file, mBlog, portraitUrl,
bRound, suffix);
}
} else{
file = Utils.checkCache(saveDir, portraitUrl);
if (file == null) {
Bitmap bm = loadFromNet(context, portraitUrl, saveDir, mBlog, bRound, suffix);
if (bm == null || bm.isRecycled())
return loadFromNet(context, portraitUrl, saveDir, mBlog, bRound, suffix);
return bm;
}
else {
return loadFromFile(context, file, mBlog, portraitUrl,
bRound, suffix);
}
}
}
return null;
}
我们可以这样来下载图片:
public byte[] getPictureByte(String url) throws HttpException {
InputStream inputStream;
HttpGet request = new HttpGet(url);
HttpClient client = getHttpClient();
request.setHeader("User-Agent", Constants.USER_AGENT);
try {
HttpResponse response = client.execute(request);
StatusLine status = response.getStatusLine();
if (status.getStatusCode() != Constants.HTTP_STATUS_OK) {
throw new HttpException(String.format(
"Invalid response from server: %s", status.toString()));
}
// Pull content stream from response
HttpEntity entity = response.getEntity();
inputStream = entity.getContent();
} catch (IOException e) {
if (client != null) {
client.getConnectionManager().shutdown();
}
throw new HttpException("Problem communicating with API", e);
}
try {
ByteArrayOutputStream content = new ByteArrayOutputStream();
byte[] imageByte;
int readBytes = 0;
while ((readBytes = inputStream.read(sBuffer)) != -1) {
content.write(sBuffer, 0, readBytes);
content.flush();
}
imageByte = content.toByteArray();
content.close();
if (client != null) {
client.getConnectionManager().shutdown();
}
return imageByte;
} catch (IOException e) {
if (client != null) {
client.getConnectionManager().shutdown();
}
throw new HttpException(UNKNOWN_ERROR, e);
}
}