如果写一个微博的一个ListView
2014-08-01 23:05
162 查看
先上效果图:
这是个ListView:
layout是:
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>();
我们可以这样来下载图片:
代码下载:http://download.csdn.net/detail/baidu_nod/7705375
这是个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); } }
代码下载:http://download.csdn.net/detail/baidu_nod/7705375
相关文章推荐
- android如果用ListView做一个表格形式
- 如果是listView用BaseAdapta的话,你每加载一个listItem就调用一次getView()
- 微博文摘: 如果一个公司购进了100台台式机。。。
- android如果用ListView做一个表格形式
- ,避免造成混乱。 设想1:拿ListView为例,如果ListView的ItemView复用机制,所有的ItemView复用同一个,如果在多线程下载图片的情况下,可能最终只有最后一个View显示图片
- 今天经理让写一个随机加密的密钥,把思路写出来,作为参考,如果那位在这方面有新的尝试,希望能与大家分享
- 【蛙蛙王子】如果你是一个企业的销售人员,你希望CRM给你提供哪些方便的功能呢?
- 如果获取一个表列的最大值..
- 如果搞一个免费的J2ME入门培训,你有兴趣参加吗?
- 如果一个男人真的爱你
- 如果有一个女孩为你哭泣
- 如果搞一个免费的J2ME入门培训,你有兴趣参加吗?
- 使用Url Rewrite 如果原始Url就带QueryString时候的一个问题
- 悬而未决:如果改一个未能启动的WINXP注册表
- 今天遇到一个问题才知道如果安装了命名实例 SSIS Service 需要手动更改配置文件
- Dialog中加入一个工具栏如果让它有提示信息
- 一个不错的SQL储存过程分页,储存过程+Repeater,如果只是浏览数据的话,快就一个字
- 如果你接管了一个存在进行的项目?
- 如果你知道我是一个妓女,你会娶我吗?[转帖]
- 怎么用asp或asp.net取得当前流媒体是有流的, 也就是说,如果一个视频能播放就显示出来,如果不能播放就堪不显示出来