zoukankan      html  css  js  c++  java
  • 列表视图(ListView和ListActivity)

    在ListView中显示网络图片

     ImageView 类虽然有一个 setImageUri 方法,但不能直接接受一个由网络地址生成的uri作为参数从而显示图片,我们只好使用其 setImageBitmap 方法来转换。 

    我们来做一个如下的文章列显示:

    先声明一个类文章类来初始化数据:

    public class ListViewItemData {
            private String itemTitle;
            private String itemPhoto;
            private String itemSummary;
            private String itemAuthor;
            private String itemPublishtime;
    
            public ListViewItemData() {
                super();
            }
    
            public ListViewItemData(String itemTitle, String itemPhoto, String itemSummary, String itemAuthor, String itemPublishtime) {
                super();
                this.itemTitle = itemTitle;
                this.itemPhoto = itemPhoto;
                this.itemSummary = itemSummary;
                this.itemAuthor = itemAuthor;
                this.itemPublishtime = itemPublishtime;
            }
    
            public String getTitle() {
                return this.itemTitle;
            }
    
            public Bitmap getPhoto() {
                String url = this.itemPhoto;
                URL myFileUrl = null;
                Bitmap bitmap = null;
                try {
                    myFileUrl = new URL(url);
                    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;
            }
    
            public String getSummary() {
                return this.itemSummary;
            }
    
            public String getAuthor() {
                return this.itemAuthor;
            }
    
            public String getPublishtime() {
                return this.itemPublishtime;
            }
        }

    其中getPhoto方法根据URL用来获得在线图片,返回对应的Bitmap。

    制造数据,一般来说是从网络上获得,此处为了方便手工造:

    public List<ListViewItemData> getListData() {
            List<ListViewItemData> listData = new ArrayList<ListViewItemData>();
            listData.add(new ListViewItemData("android异常总结一", "http://pic.cnitblog.com/face/u471123.jpg?id=07112321", "一、场景再现=========================同事甲:搞什么搞,已经两年没参加忘年会了,今年又在这里加班。同事乙:都一样,赶上今天你值夜班,能有什么办法。同事甲:人家忘年会有东西吃,你饿不饿?叫外卖?同事乙:好哦,还是上次那家吧。========================= 二", "烈火残躯", "2014-03-19 22:19"));
            listData.add(new ListViewItemData("HTML5 History API实现无刷新跳转", "http://pic.cnitblog.com/face/306530/20140307103012.png", "本篇和大家一起了解一下Windows 8.1 中磁贴的更新,我们来看看如何利用它做出更好的应用磁贴。首先我们从展现形式上来对比一下Windows 8 与 Windows 8.1 中的磁贴:Windows 8支持两种尺寸的磁贴,正方形磁贴(150 * 150 像素)和长方形磁贴(310 * 150 像", "sdsdsds", "2014-03-19 22:19"));
            listData.add(new ListViewItemData("c++ 异常处理(1)", "http://pic.cnitblog.com/face/u46305.jpg", "图文化的说明,.net程序员,入职后的发展路线。我将发展路线归为三类。1、技术专精;2、产品策划;3、数据运营。并对每条路线进行了优劣势分析。欢迎各位一起来讨论,不能这么浑浑噩噩的折腾了", "幕后黑手-Boss", "2014-03-19 22:19"));
            listData.add(new ListViewItemData("服务器批量管理工具的快速开发", "http://pic.cnitblog.com/face/603528/20140316211142.png", "当我们需要控制一个局域网中的很多台服务器时,一个简单的全局操作可能会被放大地异常繁琐,这时我们就会需要新的工具来帮助我们快速完成这种工作。在本文中,我们在ssh客户端提供的一些工具的基础上完成这一工具的开发,我们的开发平台是GNU/Linux。我们将会开发四个有用的小工具,下面即是我们整个系统的鸟瞰", "东邪独孤", "2014-03-19 22:19"));
            listData.add(new ListViewItemData("揭秘uc浏览器一", "http://pic.cnitblog.com/face/440253/20140306132605.png", "首先,看一下项目完成后的,最终效果是这样的:一.主界面二,书签界面三、主界面四.操作对话框界面这几个界面你是否看到了uc浏览器的影子了,其实我说你也可以了,在接下来篇幅中,我将手把手叫大家完成这个浏览器。首先,我们从主界面开始吧,这是一个主线,项目的一些开始由他开始了。从图一中,我们可以看出其布局文", "laozhu1124", "2014-03-19 22:19"));
            listData.add(new ListViewItemData("【WPF】制作自定义的列表项面板", "http://pic.cnitblog.com/face/367389/20140226103259.png", "我们在使用像ListBox的列表控件时,我们都知道可以通过其ItemsPanel的依赖项属性来自定义一个面板来放置列表控件中的列表项。除了CLR库提供的几个面板外,我们完全可以把自己写的面板作为项列表的容器。先给各位看看效果。如何?效果还好吧?面板的原理是这样的:1、从Panel类派出一个类,我命名", "东邪独孤2", "2014-03-19 22:19"));
            return listData;
        }

    然后生成SimpleAdapter需要的数据:

    public ArrayList<HashMap<String, Object>> getItem() {
    
            List<ListViewItemData> listData = this.getListData();
            ArrayList<HashMap<String, Object>> item = new ArrayList<HashMap<String, Object>>();
            for (ListViewItemData data : listData) {
                HashMap<String, Object> map = new HashMap<String, Object>();
                map.put("itemTitle", data.getTitle());
                map.put("itemPhoto", data.getPhoto());
                map.put("itemSummary", data.getSummary());
                map.put("itemAuthor", data.getAuthor());
                map.put("itemPublishtime", data.getPublishtime());
                item.add(map);
            }
            return item;
        }

    ListView中item布局:

    <?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:descendantFocusability="afterDescendants"
        android:orientation="vertical" >
    
        <!-- 博文题目 -->
    
        <TextView
            android:id="@+id/viewTitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="5dp"
            android:lines="1"
            android:textColor="#0000FF"
            android:textStyle="bold" />
        <!-- 作者头像和博文概要 -->
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="2dp"
            android:orientation="horizontal" >
    
            <ImageView
                android:id="@+id/imgPhoto"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="2dp"
                android:src="@drawable/ic_launcher"
                 />
    
            <TextView
                android:id="@+id/viewSummary"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="2dp"
                android:lines="3" />
        </LinearLayout>
        <!-- 作者昵称和发布日期 -->
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="2dp"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="2dp"
            android:orientation="horizontal" >
    
            <TextView
                android:id="@+id/viewAuthor"
                android:layout_width="80dp"
                android:layout_height="wrap_content"
                android:textColor="#0000FF" />
    
            <TextView
                android:id="@+id/viewPublishtime"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>
    
    </LinearLayout>

    还需要一个ListView,此处我用了一个list_separator_line图片来分隔上下行:

    <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" >
    
        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:divider="@drawable/list_separator_line" />
    
    </LinearLayout>

    在SimpleAdapter中需要一个数据源,用来存储数据的,在显示图片时我们要用HashMap<>存储一个Bitmap;但仅存取了Bitmap时在ListView中是无法显示图片的,我们需要对SimpleAdapter进行处理 。

    如下是对SimpleAdaptr处理的主要代码
     
    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;
                    } else
                        return false;
    
                }
            });

    然后给ListView绑定,MainActivity完整代码:

    package com.example.androidlistview;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.R.integer;
    import android.R.string;
    import android.os.Bundle;
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.view.Menu;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    import android.widget.SimpleAdapter.ViewBinder;
    
    public class MainActivity extends Activity {
    
        private ListView listView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            listView = (ListView) this.findViewById(R.id.listView);
            // 创建简单适配器SimpleAdapter
            SimpleAdapter simpleAdapter = new SimpleAdapter(this, this.getItem(), R.layout.listview_item, new String[] { "itemTitle", "itemPhoto", "itemSummary", "itemAuthor", "itemPublishtime" }, new int[] { R.id.viewTitle, R.id.imgPhoto, R.id.viewSummary, R.id.viewAuthor, R.id.viewPublishtime });
            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;
                    } else
                        return false;
    
                }
            });
            // 加载SimpleAdapter到ListView中
            listView.setAdapter(simpleAdapter);

      

          // 添加点击事件
          listView.setOnItemClickListener(new OnItemClickListener() {

          @Override
          public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
          // 获得选中项的HashMap对象
          HashMap<String, Object> map = (HashMap<String, Object>) listView.getItemAtPosition(arg2);
          String title = map.get("itemTitle").toString();
          String content = map.get("itemAuthor").toString();
          Toast.makeText(getApplicationContext(), "你选择了第" + arg2 + "个Item,itemTitle的值是:" + title + "itemAuthor的值是:" + content, Toast.LENGTH_SHORT).show();
          }

          });

    
        }
    
        /**
         * @return
         */
        public ArrayList<HashMap<String, Object>> getItem() {
    
            List<ListViewItemData> listData = this.getListData();
            ArrayList<HashMap<String, Object>> item = new ArrayList<HashMap<String, Object>>();
            for (ListViewItemData data : listData) {
                HashMap<String, Object> map = new HashMap<String, Object>();
                map.put("itemTitle", data.getTitle());
                map.put("itemPhoto", data.getPhoto());
                map.put("itemSummary", data.getSummary());
                map.put("itemAuthor", data.getAuthor());
                map.put("itemPublishtime", data.getPublishtime());
                item.add(map);
            }
            return item;
        }
    
        public List<ListViewItemData> getListData() {
            List<ListViewItemData> listData = new ArrayList<ListViewItemData>();
            listData.add(new ListViewItemData("android异常总结一", "http://pic.cnitblog.com/face/u471123.jpg?id=07112321", "一、场景再现=========================同事甲:搞什么搞,已经两年没参加忘年会了,今年又在这里加班。同事乙:都一样,赶上今天你值夜班,能有什么办法。同事甲:人家忘年会有东西吃,你饿不饿?叫外卖?同事乙:好哦,还是上次那家吧。========================= 二", "烈火残躯", "2014-03-19 22:19"));
            listData.add(new ListViewItemData("HTML5 History API实现无刷新跳转", "http://pic.cnitblog.com/face/306530/20140307103012.png", "本篇和大家一起了解一下Windows 8.1 中磁贴的更新,我们来看看如何利用它做出更好的应用磁贴。首先我们从展现形式上来对比一下Windows 8 与 Windows 8.1 中的磁贴:Windows 8支持两种尺寸的磁贴,正方形磁贴(150 * 150 像素)和长方形磁贴(310 * 150 像", "sdsdsds", "2014-03-19 22:19"));
            listData.add(new ListViewItemData("c++ 异常处理(1)", "http://pic.cnitblog.com/face/u46305.jpg", "图文化的说明,.net程序员,入职后的发展路线。我将发展路线归为三类。1、技术专精;2、产品策划;3、数据运营。并对每条路线进行了优劣势分析。欢迎各位一起来讨论,不能这么浑浑噩噩的折腾了", "幕后黑手-Boss", "2014-03-19 22:19"));
            listData.add(new ListViewItemData("服务器批量管理工具的快速开发", "http://pic.cnitblog.com/face/603528/20140316211142.png", "当我们需要控制一个局域网中的很多台服务器时,一个简单的全局操作可能会被放大地异常繁琐,这时我们就会需要新的工具来帮助我们快速完成这种工作。在本文中,我们在ssh客户端提供的一些工具的基础上完成这一工具的开发,我们的开发平台是GNU/Linux。我们将会开发四个有用的小工具,下面即是我们整个系统的鸟瞰", "东邪独孤", "2014-03-19 22:19"));
            listData.add(new ListViewItemData("揭秘uc浏览器一", "http://pic.cnitblog.com/face/440253/20140306132605.png", "首先,看一下项目完成后的,最终效果是这样的:一.主界面二,书签界面三、主界面四.操作对话框界面这几个界面你是否看到了uc浏览器的影子了,其实我说你也可以了,在接下来篇幅中,我将手把手叫大家完成这个浏览器。首先,我们从主界面开始吧,这是一个主线,项目的一些开始由他开始了。从图一中,我们可以看出其布局文", "laozhu1124", "2014-03-19 22:19"));
            listData.add(new ListViewItemData("【WPF】制作自定义的列表项面板", "http://pic.cnitblog.com/face/367389/20140226103259.png", "我们在使用像ListBox的列表控件时,我们都知道可以通过其ItemsPanel的依赖项属性来自定义一个面板来放置列表控件中的列表项。除了CLR库提供的几个面板外,我们完全可以把自己写的面板作为项列表的容器。先给各位看看效果。如何?效果还好吧?面板的原理是这样的:1、从Panel类派出一个类,我命名", "东邪独孤2", "2014-03-19 22:19"));
            return listData;
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
    }

    以上就是一般的对于网络图片绑定ListView处理方式,好一点的处理方式是定制扩展一个SimpleAdapter专用来处理图片绑定。

     

    注意:此例是显示网络图片 要记得添加权限,否则报错:java.net.SocketException: Permission denied
    <uses-permission android:name="android.permission.INTERNET">
  • 相关阅读:
    .NET使用DAO.NET实体类模型操作数据库
    .NET连接数据库及基本增删改查
    Struts2超链接
    微信小程序与Java后台的通信
    Java中重载和重写的区别
    Java中Double保留后小数位的几种方法
    北大集训2019游记
    HTML5前端
    软件测试面试题2018
    软件测试笔试题(2018精华篇)
  • 原文地址:https://www.cnblogs.com/zhangs1986/p/3612647.html
Copyright © 2011-2022 走看看