起因

最近在看一些开源项目时,经常看到了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. Navicat 激活教程2021(Linux)

    Navicat 激活教程2021(Linux) 目录 背景 环境 激活 清理 使用 背景 Navicat 是香港卓软数字科技有限公司生产的一系列 MySQL.MariaDB.MongoDB.Oracl ...

  2. 1D RKDG to shallow water equations

    RKDG to shallow water equations 1.Governing Equations \[\frac{\partial U}{\partial t} + \frac{\parti ...

  3. git冲突

    常规操作: # quan @ quandeMacBook-Pro in ~/Desktop/10-01/app_addressing----quan on git:1.0.1.Release o [1 ...

  4. R shinydashboard ——2. 结构

    目录 1.Shiny和HTML 2.结构 3. 标题Header 4. 侧边栏Siderbar 5.主体/正文Body box tabBox infoBox valueBox Layouts 1.Sh ...

  5. DNS域名解析全过程

    一张图看懂DNS域名解析全过程   DNS域名解析是互联网上非常重要的一项服务,上网冲浪(还有人在用这个词吗?)伴随着大量DNS服务来支撑,而对于网站运营来说,DNS域名解析的稳定可靠,意味着更多用户 ...

  6. 34. Swap Nodes in Pairs

    Swap Nodes in Pairs My Submissions QuestionEditorial Solution Total Accepted: 95230 Total Submission ...

  7. MySQL深层理解,执行流程

    MySQL是一个关系型数据库,关联的数据保存在不同的表中,增加了数据操作的灵活性. 执行流程 MySQL是一个单进程服务,每一个请求用线程来响应, 流程: 1,客户请求,服务器开辟一个线程响应用户. ...

  8. day34 前端基础之JavaScript

    day34 前端基础之JavaScript ECMAScript 6 尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标准化的部分.实际上 ...

  9. 启动spark-shell --master yarn的bug

    报错如下 18/06/06 15:55:31 ERROR cluster.YarnClientSchedulerBackend: Yarn application has already exited ...

  10. 转 android design library提供的TabLayout的用法

    原文出处:http://chenfuduo.me/2015/07/30/TabLayout-of-design-support-library/ 在开发中,我们常常需要ViewPager结合Fragm ...