起因

最近在看一些开源项目时,经常看到了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 展示图片的更多相关文章

  1. Android 控件使用教程(三)—— NineGridImageView 九宫格展示图片

    引子 上文降到RecyclerView的使用,确实非常方便易用,而且样式多样,很灵活.但在图像展示时,经常有朋友圈和微博等9张图以内的图片展示需求,这时候,不是一个可以无限下滑的RecyclerVew ...

  2. Android 控件使用教程(二)—— RecyclerView 展示图片

    简介 在上一篇博文中,介绍了大家已经很熟悉的布局控件ListView,在这篇文章中,我将使用比较新.功能也更强大的RecyclerView. RecyclerView 首先,要用这个控件,你需要在gr ...

  3. [Android Pro] android控件ListView顶部或者底部也显示分割线

    reference to  :  http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在 ...

  4. Android控件介绍

    1. 介绍 Android控件大多位于android.widget, android.view.View为他们的父类对于Dialog系列, android.app.Dialog为父类 Android的 ...

  5. 【Android - 控件】之V - ViewPager的使用

    ViewPager是Android V4包中的一个控件,常常用来作为首页的滚动广告,也常常结合Fragment来实现页面的切换效果. ViewPager和ListView有很多相似的地方,都是适配器控 ...

  6. 【Android - 控件】之MD - RecyclerView的使用

    RecyclerView是Android 5.0新特性——Material Design中的一个控件,它将ListView.GridView整合到一起,可以使用极少的代码在ListView.GridV ...

  7. Android控件RecyclerView的基本用法

    Android控件RecyclerView的基本用法 转 https://www.jianshu.com/p/e71a4b73098f   github: https://github.com/Cym ...

  8. UIAutomator定位Android控件的方法

    UIAutomator各种控件定位的方法. 1. 背景 使用SDK自带的NotePad应用,尝试去获得在NotesList那个Activity里的Menu Options上面的那个Add note菜单 ...

  9. Android控件系列之CheckBox

    学习目的: 1.掌握在Android中如何建立CheckBox 2.掌握CheckBox的常用属性 3.掌握CheckBox选中状态变换的事件(监听器) CheckBox简介: CheckBox和Bu ...

随机推荐

  1. EXCEL-批量修改列宽

    WPS:先用鼠标选中一列,然后,长按ctrl键并且用鼠标选中剩余想要统一列宽的列,松开ctrl键,鼠标落在刚选中的任意一列的抬头上,鼠标右键,选择列宽,设置统一列宽即可.

  2. EXCEL ctrl+e 百变用法不只是你用的那么简单

    Excel2013版本中,新增加了一个快捷键:Ctrl+E,可以依据字符之间的关系,实现快速填充功能.一些需要使用公式或者其他功能进行解决的问题,现在只要一个快捷键就可以实现了. 用法1:快速拆解出需 ...

  3. mysql 多表关联查询

    多个表右链接查询 名字,学校名称,学校类型,城市名称,国家地区 左链接查询 子查询 索引 #创建MySQL时添加索引 mysql> create table userIndex( id int ...

  4. matplotlib以对象方式绘制子图

    matplotlib有两种绘图方式,一种是基于脚本的方式,另一种是面向对象的方式 面向脚本的方式类似于matlab,面向对象的方式使用起来更为简便 创建子图的方式也很简单 fig,ax = plt.s ...

  5. 巩固javaweb第十六天

    巩固内容: 下拉框 在注册功能中,地区的选择使用了下拉框,可以从地区选项中选择一个地区.在这个 例子中,只允许选择一个,而在有些情况下,下拉框可以进行多选.所以,从功能上来说, 下拉框具有单选按钮和复 ...

  6. 游戏案例|Service Mesh 在欢乐游戏的应用演变和实践

    作者 陈智伟,腾讯 12 级后台专家工程师,现负责欢乐游戏工作室公共后台技术研发以及团队管理工作.在微服务分布式架构以及游戏后台运维研发有丰富的经验. 前言 欢乐游戏工作室后台是分布式微服务架构,目前 ...

  7. 【MPI环境配置】 vs2019配置MPI环境

    MPI 即 Message-Passing Interface,提供了一系列并行编程的接口,为了在本机能够学习和使用并行编程,需要提前安装MPI; 配置环境: Microsoft Visual Stu ...

  8. 【leetcode】986. Interval List Intersections (双指针)

    You are given two lists of closed intervals, firstList and secondList, where firstList[i] = [starti, ...

  9. Qt——error之undefined reference to `vtable for classname

    可能原因:自定义类中使用自定义槽和信号,但是没有在类中增加Q_OBJECT, 解决办法:在类中增加Q_OBJECT,删除编译产生的文件进行重新编译 具体原因分析如下 博主原文

  10. springboot-使用AOP日志拦截实现

    一 前言 借助spring的AOP功能,我们可以将AOP应用至全局异常处理,全局请求拦截等,本篇文章的核心功能就是使用AOP实现日志记录,比如哪些用户进行了哪些操作,对于一个成功的项目这是必须记录的, ...