学习Android之SimpleAdapter显示网络图片

效果图:

 

 

此程序主要的知识点是:SimpleAdapter本身是不支持网络图片的, 如果在Map.put(a,b)中 b为一个Bitmap,程序不会报红色字体,而是在控制台输出绿色的字体,如下

05-10 15:46:45.474: I/System.out(846): resolveUri failed on bad bitmap uri: android.graphics.Bitmap@43e40c08

要想实现显示网络图片其实很简单,使用SimpleAdapter中的方法simpleAdapter.setViewBinder()。

 

 

simpleAdapter.setViewBinder(new ViewBinder() {

			@Override
			public boolean setViewValue(View view, Object data,
					String textRepresentation) {
				if (view instanceof ImageView && data instanceof Bitmap) {
					ImageView iv = (ImageView) view;
					iv.setImageBitmap((Bitmap) data);
					return true;
				}
				return false;
			}
		});

 

 

new SimpleAdapter(MainActivity.this,getData(), R.layout.t, new String[] { "images" },new int[] { R.id.ImageVIew_main });


有三个参数view,data,textRepresentation,说说前两个参数,view 是你自定义布局(如上 R.layout.t)中所有的组件,程序会遍历一边布局中的组件,data是你传的

list<map< , >>(如上getData()方法,返回一个list<map< , >>),程序会遍历每一项数据。接下来用if()语句筛选就可以了。

 

既然是网络图片,那就需要权限

 

 <uses-permission android:name="android.permission.INTERNET" />

 

 

 

代码如下:

MainActivity.java

 

public class MainActivity extends ActionBarActivity {


	ListView listView;
	List<Map<String, ?>> data;

	String str[] = { "",       //自己添加图片网址 h  t  t  p ://
			"",
			"",
			"" };

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listView = (ListView) findViewById(R.id.LV_main);

		SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this,
				getData(), R.layout.t, new String[] { "images" },
				new int[] { R.id.ImageVIew_main });
		simpleAdapter.setViewBinder(new ViewBinder() {

			@Override
			public boolean setViewValue(View view, Object data,
					String textRepresentation) {
				if (view instanceof ImageView && data instanceof Bitmap) {
					ImageView iv = (ImageView) view;
					iv.setImageBitmap((Bitmap) data);
					return true;
				}
				return false;
			}
		});

		listView.setAdapter(simpleAdapter);
	}

	public List<Map<String, ?>> getData() {
		data = new ArrayList<Map<String, ?>>();
		for (int i = 0; i < str.length; i++) {
			Map<String, Object> map = new HashMap<String, Object>();

			map.put("images", returnBitMap(str[i]));
			data.add(map);
		}
		return data;

	}

	public Bitmap returnBitMap(String url) {
		URL myFileUrl = null;
		Bitmap bitmap = null;
		try {
			myFileUrl = new URL(url);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		try {
			HttpURLConnection conn = (HttpURLConnection) myFileUrl
					.openConnection();
			conn.setDoInput(true);
			conn.connect();
			InputStream is = conn.getInputStream();
			bitmap = BitmapFactory.decodeStream(is);
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return bitmap;
	}
}


activity_main.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ListView 
    android:id="@+id/LV_main"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"></ListView> 
</LinearLayout>


自定义布局文件

t.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <ImageView 
        android:id="@+id/ImageVIew_main"
        android:layout_width="80dp"
        android:layout_height="80dp"/>

</LinearLayout>

补充说明:

以为listview+SimpleAdapter不会有人使用,只是用来记录了我成长的印记,但是,每隔一段时间就会有人来评论,觉得有必要更新一下,以适应android发展。

就上面代码,做出调整。废弃returnBitMap方法。

更改setViewValue方法并使用glide框架来加载图片。

导入glide框架

dependencies {
    ..........
    implementation 'com.github.bumptech.glide:glide:4.10.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'
}

修改setViewValue

            public boolean setViewValue(View view, Object data,
                                        String textRepresentation) {
                if (view instanceof ImageView) {
                    ImageView iv = (ImageView) view;
                    Glide.with(iv.getContext()).load((String) data).into(iv);
                    return true;
                }
                return false;
            }

 

 

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值