Android ListView显示网络图片 [复制链接]

来源:互联网 发布:tf idf算法实现 编辑:程序博客网 时间:2024/05/03 11:31
第一步:分析api

     使用ListView都需要使用Adapter,而api中的adapter都继承自BaseAdapter,所以第一反应就是自己实现一个继承自BaseAdapteradapter,但是BaseAdapter还是属于高度抽象的基类,所以实现起来还是还是有点难度的。此时作为初学者的你(当然我也是啦)应该最熟悉的是SimpleAdapter了吧,而且SimpleAdapter也可以实现在ListView显示图片,但是就是不能显示网络图片,只能显示在drawalbe中定义过的图片。所以就想,我是否可以改写SimpleAdapter的类,在它实例化drawalbe中图片时。

     第二步:源码分析

     经过查看源码SimpleAdapter发现,显示每个item视图都是通过调用(int position, View convertView, ViewGroup parent)方法来实现的。

Java代码:
  1. public View getView(int position, View convertView, ViewGroup parent) { 
  2. return createViewFromResource(position, convertView, parent, mResource); 
  3. }
复制代码

     在 getView(int position, View convertView, ViewGroup parent) 中又调用了SimpleAdapter的私有方法createView FromResource来组装View,在 createViewFromResource中对SimpleAdapter的参数String[] from和int[] to进行了组装,代码如下:

Java代码:
  1. private View createViewFromResource(int position, View convertView, 
  2. ViewGroup parent, int resource) { 
  3. View v; 
  4. if (convertView == null) { 
  5. v = mInflater.inflate(resource, parent, false); 

  6. final int[] to = mTo; 
  7. final int count = to.length; 
  8. final View[] holder = new View[count]; 

  9. for (int i = 0; i < count; i++) { 
  10. holder = v.findViewById(to); 


  11. v.setTag(holder); 
  12. } else { 
  13. v = convertView; 


  14. bindView(position, v); 

  15. return v; 
  16. }
复制代码

     在createViewFromResource方法中又有一个bindView(position, v)方法对item中的各个View进行了组装,bindView(position, v)代码如下:

Java代码:
  1. private void bindView(int position, View view) {
  2. final Map dataSet = mData.get(position);
  3. if (dataSet == null) {
  4. return;
  5. }

  6. final ViewBinder binder = mViewBinder;
  7. final View[] holder = (View[]) view.getTag();
  8. final String[] from = mFrom;
  9. final int[] to = mTo;
  10. final int count = to.length;

  11. for (int i = 0; i < count; i++) {
  12. final View v = holder[i];
  13. if (v != null) {
  14. final Object data = dataSet.get(from[i]);
  15. String text = data == null ? "" : data.toString();
  16. if (text == null) {
  17. text = "";
  18. }

  19. boolean bound = false;
  20. if (binder != null) {
  21. bound = binder.setViewValue(v, data, text);
  22. }

  23. if (!bound) {
  24. if (v instanceof Checkable) {
  25. if (data instanceof Boolean) {
  26. ((Checkable) v).setChecked((Boolean) data);
  27. } else {
  28. throw new IllegalStateException(v.getClass().getName() +
  29. " should be bound to a Boolean, not a " + data.getClass());
  30. }
  31. } else if (v instanceof TextView) {
  32. // Note: keep the instanceof TextView check at the bottom of these
  33. // ifs since a lot of views are TextViews (e.g. CheckBoxes).
  34. setViewText((TextView) v, text);
  35. } else if (v instanceof ImageView) {
  36. if (data instanceof Integer) {
  37. setViewImage((ImageView) v, (Integer) data);
  38. } else {
  39. setViewImage((ImageView) v, text);
  40. }
  41. } else {
  42. throw new IllegalStateException(v.getClass().getName() + " is not a " +
  43. " view that can be bounds by this SimpleAdapter");
  44. }
  45. }
  46. }
  47. }
  48. }
复制代码

      终于找到了对ViewImage进行组装的代码了“else if (v instanceof ImageView)”,我们留成功之差一步之遥了!

     看到上面茫茫的代码是不是已经头晕了呢,其实以上的都是源代码,我没有做过任何的修改,也不需要修改,只是需要把它从SimpleAdapter中取出来进行覆盖,以为他们私有方法,不能用super调用!到最后终于到你出手的时候了,你需要重写SimpleAdapter类中的 setViewText方法,SimpleAdaptersetViewText进行了重载,有两个方法,代码如下:

Java代码:
  1. public void setViewImage(ImageView v, int value) {
  2. v.setImageResource(value);
  3. }

  4. public void setViewImage(ImageView v, String value) {
  5. try {
  6. v.setImageResource(Integer.parseInt(value));
  7. } catch (NumberFormatException nfe) {
  8. v.setImageURI(Uri.parse(value));
  9. }
  10. }
复制代码

     我们用Bitmap 来对ImageView进行设置,WebImageBuilder.returnBitMap是我自己实现的获取网络图片的方法,说到这,我的解释也就说完了,希望可以给大家帮助!
原创粉丝点击