Android开发笔记之ListView实现网络图片的显示

来源:互联网 发布:淘宝手机详情页装修 编辑:程序博客网 时间:2024/05/22 04:40

采用ListView来显示网络图片,需要理清思路

第一步:我们需要一个listview布局来显示我们的图片,同时我们还需要一个list_item.xml来填充我们的listview

第二步:我们要得到一张网络图片,此图片是我们通过网络获取得到,为了得到网络图片我们需要有获取网路图片的方法

第三步:网络图片我们得到了,listview布局我们也有了,我们需要一个中间数据显示的适配器即Adapter

第四步:我们去自定义一个适配器,来显示我们得到的图片

大概就是以上几步,有书本的人可以去参考下适配器知识和网络获取数据相关的知识,再结合我所写的例子会有更深的理解. 好的 我们现在开始来实现我们的代码吧!!!!!!!!!!!!!

--------------------------------------------------------------------------------

第一步:我们先去实现我们的布局

--------------------------------------------------------------------------------

主布局如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <Button
        android:id="@+id/main_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="换图" />
    <ListView 
        android:id="@+id/main_lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ></ListView>
</LinearLayout>

---------------------------------------------------------------

list_item.xml的布局如下

------------------------------------------------

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <ImageView
        android:id="@+id/item_iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"/>
</LinearLayout>

----------------------------------------------------------------------------------------

第二步获取网路图片的方法

--------------------------------------------------------------------------------

private Bitmap getImageByGet(String path){
try {
//1、先创建一个URL的对象
URL url = new URL(path);
//2、创建一个HttpURLConnection对象
//url.openConnection
HttpURLConnection connection = (HttpURLConnection) 
url.openConnection();
//3、设置请求方式
connection.setRequestMethod("GET");
//设置请求的超时时间  单位毫秒
connection.setConnectTimeout(8000);
//4、判断请求是否成功  404找不到地址  500服务器错误 
//返回正确码 200
if(connection.getResponseCode() == 200){
//5、获取输入流,网络请求过来的数据流
InputStream inputStream = connection.getInputStream();
//6、把inputStream转换成Bitmap
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
}else{
return null;
}

} catch (Exception e) {
e.printStackTrace();
}
return null;
}

----------------------------------------------------------------------------------------------

第三步:网络图片我们得到了,listview布局我们也有了,我们需要一个中间数据显示的适配器即Adapter

第四步:我们去自定义一个适配器,来显示我们得到的图片MyAdapter

-------------------------------------------------------------------------------------------------

public class MyAdapter extends BaseAdapter {
Context context;
List<Map<String, Object>> list ;
public MyAdapter(Context context, List<Map<String, Object>> list) {
super();
this.context = context;
this.list = list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//获取到lv需要显示的item
View view = View.inflate(context, R.layout.list_item, null);
//从item布局中拿到imageview对象
ImageView iv = (ImageView) view.findViewById(R.id.item_iv);
//通过acitivty中传过来list集合给iv对象设置数据
iv.setImageBitmap((Bitmap) list.get(position).get("img"));
//item的view对象返回
return view;
}
}

--------------------------------------------------------------------------------------------------

调用获取图片的方法,通过线程来请求数据

private void setData(final String path, final int type){
new Thread(){
public void run() {
Bitmap bitmap = getImageByGet(path);
//要给主线程中的ListView对象设置数据
//当前数据在子线程,可以使用Handler机制来实现
Message message = new Message();
message.obj = bitmap;
message.what = type;
handler.sendMessage(message);
};
}.start();
}

-------------------------------------------------------------------------------------------

handler机制来处理消息,此处的handler为一个全局变量

----------------------------------------------------------------------------------------------------

//把数据更新到界面上
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
//更换或显示全部图片
//第一次进来是显示,点击button是更换
if(msg.what == -1){
//每次更换数据的时候,要先清空list结合
//否侧替换的数据会添加到list结合后面
list.clear();
for (int i = 0; i < 10; i++) {
Bitmap bitmap = (Bitmap) msg.obj;
Map<String, Object> map = new HashMap<String, Object>();
map.put("img", bitmap);
list.add(map);
}
}else{
//点击lv中item的时候
//list.get(position)返回的是一个map("img",bitmap)
//重新把list集合中对应位置的map对象重新赋值
list.get(msg.what).put("img", (Bitmap) msg.obj);
}
//该方法可以根据List集合的改变去更新显示的数据
adapter.notifyDataSetChanged();
};
};

---------------------------------------------------------------------------------------------------------

/**
* 初始化控件方法
*/
private void initView(){
btn = (Button) findViewById(R.id.main_btn);

//activity中使用listview必须进行的四个步骤
lv = (ListView) findViewById(R.id.main_lv);
list = new ArrayList<Map<String,Object>>();
adapter = new MyAdapter(this, list);
lv.setAdapter(adapter);


btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
changeImg("http://img.firefoxchina.cn/2016/04/4/201604251138080.jpg");
}


});
lv.setOnItemClickListener(new OnItemClickListener() {


@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
changeItemImg("http://img.firefoxchina.cn/2016/04/4/201604251138080.jpg", position);
}
});
}

/**
* 点击listItem调用的方法
* @param path 点击item的时候需要更换图片的图片地址
* @param position 点击的是哪一个item
*/
protected void changeItemImg(String path, int position) {
setData(path, position);
}


/**
* 点击btn 调用的方法
* @param path 图片地址
*/
private void changeImg(String path) {
setData(path, -1);
}

--------------------------------------------------------------------------

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
initView();
setData("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png", 
-1);
}

----------------------------------------------------------------------------------------------

以上就是所有的代码,每一步都有详细的解释,不会的话,我也米有办法了,多看几遍,理清以下思路,借鉴以下我的案例,不一定我的就是最好的方法,后面会陆续更新相关的知识,谢谢

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我的天猫积分不让换券了怎么办 微信手机话费充错了怎么办 自己进货在淘宝卖被投诉假货怎么办 京东买的电器售后后服务差怎么办 京东到家申请退款卖家不处理怎么办 天猫买了假货商品下架了怎么办 淘宝本地生活服务不能入驻了怎么办 淘宝店铺名在电脑上搜索不到怎么办 已经将退货寄回店家硬说没有怎么办 微信申诉账号短信验证失败怎么办 京东账号换手机号收不到短信怎么办 我的手机收不到短信通知怎么办? 淘宝卖家发货物流单号写错了怎么办 商铺买东西不给调换大小怎么办 圆通快递物流信息一直没更新怎么办 中通快递三天没更新物流信息怎么办 快递已经到了物流信息不更新怎么办 天天快递查询不更新物流信息怎么办 买车下个月分期全部付清怎么办手续 天猫客服介入以后商家不退款怎么办 淘宝上买代购奢侈品买到假货怎么办 淘宝退货卖家收到货拒绝退款怎么办 没收到货但申请了退货退款怎么办 小米商城预约中德手机没货怎么办 电脑用百度网盘下载速度超慢怎么办 ios网盘下载速度太慢怎么办 小米手机4x卡机了怎么办 小米手机4x屏幕点不动了怎么办 苹果手机连接u盘没反应怎么办 苹果官网储蓄卡分期额度不够怎么办 京东买东西发票信息填写错了怎么办 华为v9手机激活密码忘了怎么办 公司报销发票纸质的丢了怎么办 在京东上买的小天才手表坏了怎么办 美亚买东西过几天降价了怎么办 天猫买东西退款后又不想退了怎么办 自己写错了地址快递被签收了怎么办 在天猫购买东西不发货怎么办 在天猫买了东西不给我发货怎么办 天猫退货卖家收到货不退款怎么办 唯品会的账号找不回来了怎么办