Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >列表视图(ListView和ListActivity)

列表视图(ListView和ListActivity)

作者头像
欢醉
发布于 2018-01-22 03:55:21
发布于 2018-01-22 03:55:21
1.6K00
代码可运行
举报
文章被收录于专栏:james大数据架构james大数据架构
运行总次数:0
代码可运行

在ListView中显示网络图片

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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需要的数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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布局:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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图片来分隔上下行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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处理的主要代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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完整代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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处理方式,好一点的处理方式是定制扩展一个SimpleAdapter专用来处理图片绑定。

注意:此例是显示网络图片 要记得添加权限,否则报错:java.net.SocketException: Permission denied

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-03-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android开发ListView使用OnScrollListener实现分页加载数据
上篇博文和大家分享了下拉刷新,这是一个用户体验很好的操作方式。新浪微薄就是使用这样的方式的典型。
全栈程序员站长
2022/07/06
1.2K0
Android开发ListView使用OnScrollListener实现分页加载数据
ListView详细介绍与使用
关于 ListView 我们大家都应该是非常的熟悉了,在 Android 开发中是经常用到的,今天就再来回顾一下,ListView 的使用方法,和一些需要优化注意的地方,还有日常开发过程中的一些小技巧和经验。
开发者
2019/12/26
1.5K0
ListView详细介绍与使用
android ListView 例子
程序效果是实现一个ListView,ListView里面有标题、内容和图片,并加入单击和长按响应。
全栈程序员站长
2022/09/15
7470
android ListView 例子
Android项目实战(二十):浅谈ListView悬浮头部展现效果
  先看下效果:需求是 滑动列表 ,其中一部分视图(粉丝数,关注数这一部分)在滑动到顶端的时候不消失,而是停留在整个界面头部。 我们先分析要解决的问题: 1、如何实现列表ListView顶部视图跟随L
听着music睡
2018/05/18
1.4K0
13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用
ListView 是 Android 系统为我们提供的一种列表显示的一种控件,使用它可以用来显示我们常见的列表形式。继承自抽象类 AdapterView。继承图如下所示:
诺谦
2020/02/18
2.1K0
13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用
Android ListView列表分组
======================================================================== 以上为示例所有代码,以下为说明 禁止标签项的响应事件,父类BaseAdapter中提供了isEnable的()方法,我们看看这个方法:
forrestlin
2022/04/02
1.1K0
Android ListView列表分组
android listview 滑动卡顿问题解决
之前在使用listview进行每次通知一来,根据判断是否有这个标志,就更新listview所绑定的数据源,通知更新priceAd.notifyDataSetChanged();,也用了网上的建议使用viewHolder进行listview的item复用机制,但还是会出现卡顿的现象,经过分析,原来是listview的item布局嵌套太多,导致刷新的时候,重绘过多,造成卡顿的现象,以下是另一片博客的分析贴出来,大家讨论感谢这位前辈:http://blog.csdn.net/knighttools/article/details/18259485:
全栈程序员站长
2022/09/15
9750
ListView和SimpleAdapter(图文列表)
新添加一个资源文件list_array.xml,主要作用是为simpleAdapter添加显示规则:
李小白是一只喵
2020/04/24
1.4K0
美团点餐—listview内部按钮点击事件
这里面有一个类Item,就是一个实体类,里面只有name和num,和setget方法。具体看注释
cMusketeer
2018/04/05
2.7K4
美团点餐—listview内部按钮点击事件
android之ListView和adapter配合显示图片和文字列表
实际效果: 布局文件: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.a
圆号本昊
2021/09/24
1K0
android之ListView和adapter配合显示图片和文字列表
popupwindow和listview
在使用PopupWindow的时候,有一个不好的地方就是不太好设置弹出窗体的大小。如果指定绝对大小,那么对于不同分辨率不同尺寸的手机来说,显示出来效果会不同,从而导致用户体验不佳。 为了达到PopupWindow能够自适配布局大小,可以在设置长宽时候指定: popupWindow.setWidth(LayoutParams.WRAP_CONTENT);     popupWindow.setHeight(LayoutParams.WRAP_CONTENT);    下面我就来具体讲解一下在Popup
xiangzhihong
2018/01/30
1.7K0
popupwindow和listview
Android学习Tabhost、gallery、listview、imageswitcher
Tabhost控件又称分页控件,在很多的开发语言中都存在。它可以拥有多个标签页,每个标签页可以拥有不同的内容。android中,一个标签页可以放 一个view或者一个activity。TabHost是标签控件类的核心类,也是标签的集合。 1.tabhost定义 android控件中有封装好的tab控件,直接拖一个到xml文件中。下面的代码都是tab控件自己生成的。 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and
水击三千
2018/02/27
1.3K0
Android学习Tabhost、gallery、listview、imageswitcher
Carson带你学Android:全面解析列表ListView与AdapterView
2. 在MainActivity上定义一个链表,将所要展示的数据以存放在里面 3. 构造ArrayAdapter对象,设置适配器 4. 将LsitView绑定到ArrayAdapter上 如下图:
Carson.Ho
2022/03/24
1.1K0
Carson带你学Android:全面解析列表ListView与AdapterView
这个控件你必须会用!—ListView+GirdView合集
ListView 列表视图,直接继承了 AbsListView,是一个以垂直方式在项目中显示 View视图的列表。ListView的数据项,来自一个继承了 ListAdapter接口的适配器。
下码看花
2019/09/02
1.9K0
这个控件你必须会用!—ListView+GirdView合集
Android开发基础:布局,监听以及一些基础知识
android:layout_width/android:layout_height可选参数
小王不头秃
2024/06/19
1690
4-VI--☆ListView的封装支持多种条目
更多安卓技术欢迎访问:https://www.jianshu.com/c/004f3fe34c94
张风捷特烈
2018/08/29
4140
android入门 — ListView
  ListView主要是用来解决大量数据展示的问题,它的用途很广泛,几乎所有的app都会用到,比如说知乎、今日头条、微博、通讯录等。     ListView允许用户通过上下滑动的方式将屏幕外的数据
Mister24
2018/05/14
1.3K0
RecyclerView使用记录
随着公司自用app客户端功能&需求越来越复杂,某些页面的布局也越来越复杂。在前同事的建议下,使用RecyclerView来实现。
Ant丶
2022/03/01
5090
RecyclerView使用记录
android ListView 嵌套 ListView
看上去效果还是不错,不过现在有个刷新问题一直没能解决,刷新的时候里面的adapter进行刷新的时候总是会让里面的listview消失掉,应该是父listview先刷新完后,子listview还未刷新完成,导致测量的高度不对,就会消失,像当前组已关闭这种,现在这个问题还没有想到办法解决的,试过比较多的方法,添加接口让子listview 刷新完成后再去更新父listview,但还是没有作用,也用过ExpandableListView,但是效果达不到这种,所以没办法还是得用这种办法,有大神知道怎么解决刷新父listview时子listview消失的方法,指导下我,比较奇怪的时候刚开始初始化的时候子listview是默认不显示的,当点击父listview去张开子listview,父listview应该会再次刷新,但子listview展开是可以的,然后下一次更新数据源的时候子listview又会自动关闭,我猜应该是在刷新子listview的时候,父listview先更新完成,子listview的高度测量就没有对!
全栈程序员站长
2022/09/13
1.4K0
android ListView 嵌套 ListView
相关推荐
Android开发ListView使用OnScrollListener实现分页加载数据
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验