引子

上文降到RecyclerView的使用,确实非常方便易用,而且样式多样,很灵活。但在图像展示时,经常有朋友圈和微博等9张图以内的图片展示需求,这时候,不是一个可以无限下滑的RecyclerVew能解决的图片显示问题。那就需要一个类似于GridView的,九张图显示控件。并且,这个控件应该能针对不同个数的图片都有很好的显示效果,使图片尽可能大的展示在特定空间区域之内,很荣幸能遇到这样的一个开源控件,NineGridImageView.

NineGridImageView

因为是一个比较新的控件,而且作者也已经开博讲解怎么使用,所以我不过多阐述如何使用,如有需求请转步作者博客http://laobie.github.io/android/2016/03/06/nine-grid-iamge-view-libaray.html来进一步了解。我来说一说我是怎么使用的。

使用:

    compile 'com.jaeger.ninegridimageview:library:1.0.0'

xml配置:

    <com.jaeger.ninegridimageview.NineGridImageView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/ngiv_nine_grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
android:layout_marginTop="30dp"
app:imgGap="4dp"
app:showStyle="fill"
app:singleImgSize="120dp"/>

控件绑定:

    @Bind(R.id.ngiv_nine_grid)
NineGridImageView<String> nine_grid;

适配器NineGridImageViewAdapter,其中不一定是String类型,可以修改(这也是我的代码弱项):

    private NineGridImageViewAdapter<String> mAdapter = new NineGridImageViewAdapter<String>() {
@Override
protected void onDisplayImage(Context context, ImageView imageView, String url) {
Picasso.with(context)
.load(url)
.into(imageView);
} @Override
protected ImageView generateImageView(Context context) {
return super.generateImageView(context);
} @Override
protected void onItemImageClick(Context context, int index, List list) {
super.onItemImageClick(context, index, list);
} };

获得图片资源的方法可以从本系列第一篇博文中找到,这里说明如何把资源加载到NineGridImageView。已知urls_list中放的是各个图片的地址。如下方式进行adapter加载和资源输入。

        nine_grid.setAdapter(mAdapter);
nine_grid.setImagesData(urls_list);

至此,图片已经能够显示了,而且显示效果会根据图片的个数进行改变,来做到对图片的适配。效果如下:

可以看出本控件还是很方便易用的。

这是控件对item的监听的办法,需要在adapter中书写:

        @Override
protected void onItemImageClick(Context context, int index, List list) {
super.onItemImageClick(context, index, list);
Toast.makeText(context, "" + index, Toast.LENGTH_LONG).show();
}

思考

提出一些小的质疑,就是很少见到给一个控件加载适配器和加载内容是放在两行代码分别进行的吧?如在常见的ListView中,我们一般这么写:

        adapter = new ListViewAdapter(ListViewActivity.this, urls);
Log.i("urls", urls.toString());
listview.setAdapter(adapter);

adapter中加载资源,listview中设置adapter.如果数据有改变一般是这么写:

    adapter.notifyDataSetChanged();

告诉适配器内容改变了,也就是说由适配器来管理数据。本控件中是以控件来管理数据,这样我感觉很别扭。也只能勉强接受。同时我并没有看到在NineGridImageViewAdapter或者NineGridImageView中有notifyDataSetChanged();等语法来声明数据改变,或许只能重新设置数据源。

还有好像在适配器中进行控件子控件的监听好像见到的也不是很多。大部分是在view中进行setOnItemClick()方法对吧?这个我也感觉挺别扭。

但总之,这个库还是很好用的,作为图片九宫格自适应的图片展示还是很可以考虑使用的。

感谢作者提供了这个库,希望后续还有更好的改进。

结语

这是最常用的NineGridImageView的使用,项目已开源在:https://github.com/fuxuemingzhu/ViewAdapterTest,欢迎Star和交流学习。

下一篇我将讲解对ListView/RevyclerView/NineGridImageView的使用优化。

Android 控件使用教程(三)—— NineGridImageView 九宫格展示图片的更多相关文章

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

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

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

    起因 最近在看一些开源项目时,经常看到了RecyclerView,这是安卓5.0推出的一个新的控件,可以代替传统的ListView,已经这么久了还没有用过,所以决定试一试.另外在做这个的工程中看到了另 ...

  3. Android群英传笔记——第三章:Android控件架构与自定义控件讲解

    Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...

  4. Android控件GridView之仿支付宝钱包首页带有分割线的GridView九宫格的完美实现

    Android控件GridView之仿支付宝钱包首页带有分割线的GridView九宫格的完美实现 2015-03-10 22:38 28419人阅读 评论(17) 收藏 举报  分类: Android ...

  5. 第三个 android控件

    android控件以及控件对应的属性:

  6. Android控件Gridview实现仿支付宝首页,Fragment底部按钮切换和登录圆形头像

    此案例主要讲的是Android控件Gridview(九宫格)完美实现仿支付宝首页,包含添加和删除功能:Fragment底部按钮切换的效果,包含四个模块,登录页面圆形头像等,一个小项目的初始布局. 效果 ...

  7. Android 控件架构及View、ViewGroup的测量

    附录:示例代码地址 控件在Android开发的过程中是必不可少的,无论是我们在使用系统控件还是自定义的控件.下面我们将讲解一下Android的控件架构,以及如何实现自定义控件. 1.Android控件 ...

  8. Android 控件知识点,

    一.Android控件具有visibility属性,可以取三个值:visible(默认值)可见,invisible(不可见,但仍然占据原有的位置和大小,可以看做是变得透明了),gone(空间不仅不可见 ...

  9. 从Android系统出发,分析Android控件构架

    从Android系统出发,分析Android控件构架 Android中所有的控件追溯到根源,就是View 和ViewGroup,相信这个大家都知道,但是大家也许会不太清楚它们之间的具体关系是什么,在A ...

随机推荐

  1. EXCEL-COUNTIF()统计符合区间上的值个数

    =COUNTIF(D9:D21465,"<-0.2")+COUNTIF(D9:D21465,">0.2")  #计算<-0.2或者>0. ...

  2. 浅谈MySQL数据库面试必要掌握知识点

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 MySQL官方地址 https://www.mysql.com/ MySQL 8系列最新版本为8.0.27,5系列的最 ...

  3. java9 模块化 jigsaw

    java9并没有在语言层面做出很多改变,而是致力于一些新特性,如模块化,其核心就是解决历史遗留问题,为以后的jar包森林理清道路.模块化是一个很大的命题,就不讲那么细致了,关于java9的特性也有很多 ...

  4. 双向循环链表模板类(C++)

    双向链表又称为双链表,使用双向链表的目的是为了解决在链表中访问直接前驱和后继的问题.其设置前驱后继指针的目的,就是为了节省其时间开销,也就是用空间换时间. 在双向链表的每个节点中应有两个链接指针作为它 ...

  5. 100个Shell脚本——【脚本1】打印形状

    [脚本1]打印形状 一.脚本 打印等腰三角形.直角三角形.倒直角三角形.菱形 #!/bin/bash #等腰三角形 read -p "Please input the length:&quo ...

  6. SQL count和sum

    count(1).count(*)与count(列名)的执行区别 count(1) and count(字段) 两者的主要区别是 (1) count(1) 会统计表中的所有的记录数,包含字段为null ...

  7. hadoop accesscontrolException

    DFS loaction: /tmp 文件下的 hadoop-haoop/mapred/system报 AccessControlException. 解决: bin/hadoop fs -chmod ...

  8. 使用$.ajax方式实现页面异步访问,局部更新的效果

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. Log4j 被曝核弹级漏洞,开发者炸锅了!

    大家好,我是鱼皮,开门见山,知名的开源项目 Apache Log4j 出事了! 2021 年 12 月 9 日,该项目被曝存在 严重安全漏洞 ,攻击者只需要向目标机传入一段特殊代码,就能触发漏洞,自由 ...

  10. Intellij IDEA设置自定义类描述信息

    Intellij IDEA设置自定义类描述信息 样图 新建Java类自动生成模板信息:作者,时间,描述和其他信息 步骤 以 IntelliJ IDEA Community Edition 2020.1 ...