[转载]关于ListView (1)——异步加载图片 – 没有代码 – 博客园.
效果:
主要解决listview读取图片时界面无响应的问题,当然这个方法也可以扩展到读取数据库数据等等
项目的布局如下:
首先加入网络的权限
<uses-permission Android:name=”Android.permission.INTERNET” />
工具类,主要根据url读取图片返回流的方法
Request.java
<span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >Request</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > static </span><span class = "pln" > </span><span class = "typ" >InputStream</span><span class = "pln" > </span><span class = "typ" >HandlerData</span><span class = "pun" >(</span><span class = "typ" >String</span><span class = "pln" > url</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >InputStream</span><span class = "pln" > inStream</span><span class = "pun" >=</span><span class = "kwd" > null </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > try </span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > URL feedUrl </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > URL</span><span class = "pun" >(</span><span class = "pln" >url</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >URLConnection</span><span class = "pln" > conn </span><span class = "pun" >=</span><span class = "pln" > feedUrl</span><span class = "pun" >.</span><span class = "pln" >openConnection</span><span class = "pun" >();</span><span class = "pln" > conn</span><span class = "pun" >.</span><span class = "pln" >setConnectTimeout</span><span class = "pun" >(</span><span class = "lit" > 10 </span><span class = "pln" > </span><span class = "pun" >*</span><span class = "pln" > </span><span class = "lit" > 1000 </span><span class = "pun" >);</span><span class = "pln" > inStream </span><span class = "pun" >=</span><span class = "pln" > conn</span><span class = "pun" >.</span><span class = "pln" >getInputStream</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > catch </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >Exception</span><span class = "pln" > e</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > e</span><span class = "pun" >.</span><span class = "pln" >printStackTrace</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > inStream</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span> |
ListViewReadImageAscy.java
<span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >ImageAdapter</span><span class = "pln" > adapter</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > //数据源</span><span class="pln"> </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >ArrayList</span><span class = "pln" > beans </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ArrayList</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "com" > //内部类</span><span class="pln"> </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >Bean</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pln" > image</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pln" > getImage</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > image</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > setImage</span><span class = "pun" >(</span><span class = "typ" >Bitmap</span><span class = "pln" > image</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >image </span><span class = "pun" >=</span><span class = "pln" > image</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span> |
扩展BaseAdapter
<span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >ImageAdapter</span><span class = "pln" > </span><span class = "kwd" > extends </span><span class = "pln" > </span><span class = "typ" >BaseAdapter</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >ImageAdapter</span><span class = "pun" >(</span><span class = "typ" >Context</span><span class = "pln" > context</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > getCount</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > beans</span><span class = "pun" >.</span><span class = "pln" >size</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >Bean</span><span class = "pln" > getItem</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > position</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > beans</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >position</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > long </span><span class = "pln" > getItemId</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > position</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > position</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >View</span><span class = "pln" > getView</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > position</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >View</span><span class = "pln" > convertView</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >ViewGroup</span><span class = "pln" > parent</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >ImageView</span><span class = "pln" > i </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ImageView</span><span class = "pun" >(</span><span class = "pln" >getApplicationContext</span><span class = "pun" >());</span><span class = "pln" > </span><span class = "typ" >Bean</span><span class = "pln" > b </span><span class = "pun" >=</span><span class = "pln" > beans</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >position</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //如果有图片则读取,没有则跳过</span><span class="pln"> </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >b</span><span class = "pun" >.</span><span class = "pln" >getImage</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > i</span><span class = "pun" >.</span><span class = "pln" >setImageBitmap</span><span class = "pun" >(</span><span class = "pln" >b</span><span class = "pun" >.</span><span class = "pln" >getImage</span><span class = "pun" >());</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > i</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span> |
/异步加载图片,为了简洁这里请求图片链接先固定。每读取好一个图片就更新,这里界面比较简单,当然你可以做成比较好的,像很多好的软件都有这种效果,先一个loading的效果,一旦有图片了就去掉loading,显示图片。
//这里还啰嗦一点就是AsyncTask里面重载的方法doInBackground操作不能涉及到更新UI界面,不然会出错。虽这样说,但是有时候遇到像我这种情况时,是很难知道出错就是这个原因导致的。异步加载一个view时,如果那个view里面有EditText,EditText在每次加载view都会触发焦点,这时候异步就会出错。可能我这样说不太清楚,但是如果试试就会发现这种情况。
<span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >ImageLoadTask</span><span class = "pln" > </span><span class = "kwd" > extends </span><span class = "pln" > </span><span class = "typ" >AsyncTask</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >ImageAdapter</span><span class = "pln" > adapter</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > // 初始化</span><span class="pln"> </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >ImageLoadTask</span><span class = "pun" >(</span><span class = "typ" >Context</span><span class = "pln" > context</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >ImageAdapter</span><span class = "pln" > adapter</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >adapter </span><span class = "pun" >=</span><span class = "pln" > adapter</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > protected </span><span class = "pln" > </span><span class = "typ" >Void</span><span class = "pln" > doInBackground</span><span class = "pun" >(</span><span class = "typ" >Void</span><span class = "pun" >...</span><span class = "pln" > </span><span class = "kwd" >params</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > for </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > i </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "lit" > 0 </span><span class = "pun" >;</span><span class = "pln" > i </span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "pln" > adapter</span><span class = "pun" >.</span><span class = "pln" >getCount</span><span class = "pun" >();</span><span class = "pln" > i</span><span class = "pun" >++)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >Bean</span><span class = "pln" > bean </span><span class = "pun" >=</span><span class = "pln" > adapter</span><span class = "pun" >.</span><span class = "pln" >getItem</span><span class = "pun" >(</span><span class = "pln" >i</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pln" > bitmap </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >BitmapFactory</span><span class = "pln" > </span><span class = "pun" >.</span><span class = "pln" >decodeStream</span><span class = "pun" >(</span><span class = "typ" >Request</span><span class = "pln" > </span><span class = "pun" >.</span><span class = "typ" >HandlerData</span><span class = "pun" >(</span><span class = "str" > "http://avatar.profile.csdn.net/A/E/5/2_piaopiaohu123.jpg" </span><span class = "pun" >));</span><span class = "pln" > bean</span><span class = "pun" >.</span><span class = "pln" >setImage</span><span class = "pun" >(</span><span class = "pln" >bitmap</span><span class = "pun" >);</span><span class = "pln" > publishProgress</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "com" > // 通知去更新UI</span><span class="pln"> </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onProgressUpdate</span><span class = "pun" >(</span><span class = "typ" >Void</span><span class = "pun" >...</span><span class = "pln" > voids</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >isCancelled</span><span class = "pun" >())</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > // 更新UI</span><span class="pln"> adapter</span><span class = "pun" >.</span><span class = "pln" >notifyDataSetChanged</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span> |
设置数据源
<span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onCreate</span><span class = "pun" >(</span><span class = "typ" >Bundle</span><span class = "pln" > savedInstanceState</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > super </span><span class = "pun" >.</span><span class = "pln" >onCreate</span><span class = "pun" >(</span><span class = "pln" >savedInstanceState</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > for </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > i </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "lit" > 0 </span><span class = "pun" >;</span><span class = "pln" > i </span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "lit" > 15 </span><span class = "pun" >;</span><span class = "pln" > i</span><span class = "pun" >++)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >Bean</span><span class = "pln" > b </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Bean</span><span class = "pun" >();</span><span class = "pln" > b</span><span class = "pun" >.</span><span class = "pln" >setImage</span><span class = "pun" >(</span><span class = "typ" >BitmapFactory</span><span class = "pun" >.</span><span class = "pln" >decodeResource</span><span class = "pun" >(</span><span class = "pln" >getResources</span><span class = "pun" >(),</span><span class = "pln" > R</span><span class = "pun" >.</span><span class = "pln" >drawable</span><span class = "pun" >.</span><span class = "pln" >icon</span><span class = "pun" >));</span><span class = "pln" > beans</span><span class = "pun" >.</span><span class = "pln" >add</span><span class = "pun" >(</span><span class = "pln" >b</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > adapter </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ImageAdapter</span><span class = "pun" >(</span><span class = "kwd" > this </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >ListView</span><span class = "pln" > listview </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ListView</span><span class = "pun" >(</span><span class = "kwd" > this </span><span class = "pun" >);</span><span class = "pln" > listview</span><span class = "pun" >.</span><span class = "pln" >setAdapter</span><span class = "pun" >(</span><span class = "pln" >adapter</span><span class = "pun" >);</span><span class = "pln" > adapter</span><span class = "pun" >.</span><span class = "pln" >notifyDataSetChanged</span><span class = "pun" >();</span><span class = "pln" > setContentView</span><span class = "pun" >(</span><span class = "pln" >listview</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ImageLoadTask</span><span class = "pun" >(</span><span class = "kwd" > this </span><span class = "pun" >,</span><span class = "pln" > adapter</span><span class = "pun" >).</span><span class = "pln" >execute</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span> |
本文为原创,如需转载,请注明作者和出处,谢谢!
http://www.cnblogs.com/not-code/archive/2011/05/03/2035421.html
代码下载