Android 控件使用教程(一)—— ListView 展示图片
起因
最近在看一些开源项目时,经常看到了RecyclerView,这是安卓5.0推出的一个新的控件,可以代替传统的ListView,已经这么久了还没有用过,所以决定试一试。另外在做这个的工程中看到了另外一个九宫格的图片加载库,也顺便试用了一下。
ListView 使用
首先,说一下ListView,这个是最常用的控件之一,大家都比较熟。这里自己简单记录一下。
这是目标结果,获取Gank.io上的妹子的图片地址并且进行获取展示。

首先,在xml配置文件中添加ListView的代码声明。
<ListView
    android:id="@+id/lv_listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:padding="2dp"
    android:scrollbarStyle="outsideOverlay"
    android:scrollbars="vertical"/>
然后在ListViewActivity.java中使用ButterKnife进行控件绑定。
@Bind(R.id.lv_listview)
ListView listview;
记得代码中添加这句:
ButterKnife.bind(this);
下面进行数据获取并且放到一个ArrayList中,我这里只存放了图片的地址,其实可以定义图片更多属性,进行存放。数据获取选用了张洪洋的Okhttp-utils,非常方便,可以学习。数据源是大名鼎鼎的gank.io中的妹纸们。接口免费调用,同学们还是节省点用。
private String url = "http://gank.io/api/random/data/福利/20";
OkHttpUtils
        .get()
        .url(url)
        .build()
        .execute(new StringCallback() {
            @Override
            public void onError(Call call, Exception e) {
                Toast.makeText(ListViewActivity.this, "网络异常,请稍后重试", Toast.LENGTH_LONG).show();
            }
            @Override
            public void onResponse(String response) {
                if (response == null) {
                    Toast.makeText(ListViewActivity.this, "网络异常,请稍后重试", Toast.LENGTH_LONG).show();
                    return;
                }
                display(response);
            }
        });
返回数据格式如下:
{
    "error": false,
    "results": [
        {
            "_id": "56cc6d1c421aa95caa707523",
            "_ns": "ganhuo",
            "createdAt": "2015-11-04T10:33:50.564Z",
            "desc": "11.5",
            "publishedAt": "2015-11-05T04:02:52.968Z",
            "type": "福利",
            "url": "http://ww4.sinaimg.cn/large/7a8aed7bjw1exp4h479xfj20hs0qoq6t.jpg",
            "used": true,
            "who": "张涵宇"
        }
    ]
}
获得的数据需要放在ArrayList中:
private List<String> urls;
urls = new ArrayList<>();
JSONObject result = JSONObject.parseObject(response);
JSONArray jsonArray = result.getJSONArray("results");
for (int i = 0; i < jsonArray.size(); i++) {
    JSONObject temp = jsonArray.getJSONObject(i);
    urls.add(temp.getString("url"));
}
对于ArrayList中的图片的展示,必须使用Adapter.首先定义xml文件item_image.xml:
<FrameLayout 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:layout_margin="2dp"
             android:foreground="?selectableItemBackground">
    <ImageView
        android:id="@+id/picture"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitCenter"
        tools:ignore="ContentDescription"
        tools:src="@color/primary_light"/>
</FrameLayout>
再在Adapter中进行代码解析,下面代码只是可用的水准,有改进空间。
public class ListViewAdapter extends BaseAdapter {
    private final Context context;
    private final LayoutInflater inflater;
    private List<String> urls;
    public ListViewAdapter(Context context, List<String> urls) {
        this.context = context;
        this.inflater = LayoutInflater.from(context);
        this.urls = urls;
    }
    @Override
    public int getCount() {
        return urls.size();
    }
    @Override
    public Object getItem(int i) {
        return urls.get(i);
    }
    @Override
    public long getItemId(int i) {
        return 0;
    }
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder viewHolder = null;
        view = inflater.inflate(
                R.layout.item_image, null);
        viewHolder = new ViewHolder();
        viewHolder.imageView = (ImageView) view.findViewById(R.id.picture);
        String url = urls.get(i);
        Log.i("url", url);
        Picasso.with(context)
                .load(url)
                .into(viewHolder.imageView);
        ViewCompat.setTransitionName(viewHolder.imageView, url);
        return view;
    }
    public class ViewHolder {
        public ImageView imageView;
    }
}
最后进行ArrayList中的数据和Adapter进行绑定,即可展示:
    adapter = new ListViewAdapter(ListViewActivity.this, urls);
    Log.i("urls", urls.toString());
    listview.setAdapter(adapter);
上述的数据获取和展示,我封装了一下为以下函数:
private void display(String response) {
    JSONObject result = JSONObject.parseObject(response);
    JSONArray jsonArray = result.getJSONArray("results");
    for (int i = 0; i < jsonArray.size(); i++) {
        JSONObject temp = jsonArray.getJSONObject(i);
        urls.add(temp.getString("url"));
    }
    adapter = new ListViewAdapter(ListViewActivity.this, urls);
    Log.i("urls", urls.toString());
    listview.setAdapter(adapter);
}
这个函数利用了fastjson解析数据,response中的数据无论多少个,都可以快速解析并展示。
至此,网络数据的获取和在ListView中的展示全部完成,不得不说非常简单方便。
结语
这是最常用的ListView的使用,并没有多少新意,项目已开源在:https://github.com/fuxuemingzhu/ViewAdapterTest,欢迎Star和交流学习。
下篇对RecyclerView进行测试使用。
Android 控件使用教程(一)—— ListView 展示图片的更多相关文章
- Android 控件使用教程(三)—— NineGridImageView 九宫格展示图片
		引子 上文降到RecyclerView的使用,确实非常方便易用,而且样式多样,很灵活.但在图像展示时,经常有朋友圈和微博等9张图以内的图片展示需求,这时候,不是一个可以无限下滑的RecyclerVew ... 
- Android 控件使用教程(二)—— RecyclerView 展示图片
		简介 在上一篇博文中,介绍了大家已经很熟悉的布局控件ListView,在这篇文章中,我将使用比较新.功能也更强大的RecyclerView. RecyclerView 首先,要用这个控件,你需要在gr ... 
- [Android Pro]   android控件ListView顶部或者底部也显示分割线
		reference to : http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在 ... 
- Android控件介绍
		1. 介绍 Android控件大多位于android.widget, android.view.View为他们的父类对于Dialog系列, android.app.Dialog为父类 Android的 ... 
- 【Android - 控件】之V - ViewPager的使用
		ViewPager是Android V4包中的一个控件,常常用来作为首页的滚动广告,也常常结合Fragment来实现页面的切换效果. ViewPager和ListView有很多相似的地方,都是适配器控 ... 
- 【Android - 控件】之MD - RecyclerView的使用
		RecyclerView是Android 5.0新特性——Material Design中的一个控件,它将ListView.GridView整合到一起,可以使用极少的代码在ListView.GridV ... 
- Android控件RecyclerView的基本用法
		Android控件RecyclerView的基本用法 转 https://www.jianshu.com/p/e71a4b73098f github: https://github.com/Cym ... 
- UIAutomator定位Android控件的方法
		UIAutomator各种控件定位的方法. 1. 背景 使用SDK自带的NotePad应用,尝试去获得在NotesList那个Activity里的Menu Options上面的那个Add note菜单 ... 
- Android控件系列之CheckBox
		学习目的: 1.掌握在Android中如何建立CheckBox 2.掌握CheckBox的常用属性 3.掌握CheckBox选中状态变换的事件(监听器) CheckBox简介: CheckBox和Bu ... 
随机推荐
- VS Code 配置和使用
			背景 Visual Studio Code(简称VS Code)是一款由微软开发且跨平台的免费源代码编辑器[6].该软件支持语法高亮.代码自动补全(又称IntelliSense).代码重构.查看定义功 ... 
- 错误笔记: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) E: Unable to lock the administration di
			亲测可用 --jack alexander@alexander-virtual-machine:~$ sudo apt-get install -y httpdE: Could not get loc ... 
- C语言中的除法的计算
			不用除号,计算除法运算.思路是使用减法运算!思路1:循环采用减法每次减去n,直到做完减法之后结果小于0为止 但是这样次数较大 如求100/3,需要次数为34次. 思路2:循环采用减法每次减去k,K的 ... 
- accent, access, accident
			accent A colon (:) is used to represent a long vowel [元音], e.g. sheet /ʃiːt/ and shit /ʃit/. The wor ... 
- c#中实现串口通信的几种方法
			c#中实现串口通信的几种方法 通常,在C#中实现串口通信,我们有四种方法: 第一:通过MSCOMM控件这是最简单的,最方便的方法.可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册 ... 
- 【Android】安装插件 + 改变文字大小、颜色 + 隐藏代码区块的直线
			安装插件 可以在搜寻框里面填入关键字搜寻,具体的插件,网上有很多介绍了 改变文字大小.颜色 隐藏代码区块的直线 
- Java实现邮件收发
			一. 准备工作 1. 传输协议 SMTP协议-->发送邮件: 我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器) POP3协议-->接收邮件: 我 ... 
- mysql 报 'Host ‘XXXXXX’ is blocked because of many connection errors'
			1. 问题:服务启动时,日志报错,导致启动失败: Caused by: com.mysql.cj.exceptions.CJException: null, message from server: ... 
- Python初探——sklearn库中数据预处理函数fit_transform()和transform()的区别
			敲<Python机器学习及实践>上的code的时候,对于数据预处理中涉及到的fit_transform()函数和transform()函数之间的区别很模糊,查阅了很多资料,这里整理一下: ... 
- 35、搜索插入位置 | 算法(leetode,附思维导图 + 全部解法)300题
			零 标题:算法(leetode,附思维导图 + 全部解法)300题之(35)搜索插入位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 "无视要 ... 
