【译】与Adapter一起使用(ListView, GridView, ...)

简单的Gallery的实现:ListView

首先,我们需要为测试提供一些图像。我们从eatfoody.com截取了部分美味的食谱图,上传至imgur

public static String[] eatFoodyImages = {
        "http://i.imgur.com/rFLNqWI.jpg",
        "http://i.imgur.com/C9pBVt7.jpg",
        "http://i.imgur.com/rT5vXE1.jpg",
        "http://i.imgur.com/aIy5R2k.jpg",
        "http://i.imgur.com/MoJs9pT.jpg",
        "http://i.imgur.com/S963yEM.jpg",
        "http://i.imgur.com/rLR2cyc.jpg",
        "http://i.imgur.com/SEPdUIx.jpg",
        "http://i.imgur.com/aC9OjaM.jpg",
        "http://i.imgur.com/76Jfv9b.jpg",
        "http://i.imgur.com/fUX7EIB.jpg",
        "http://i.imgur.com/syELajx.jpg",
        "http://i.imgur.com/COzBnru.jpg",
        "http://i.imgur.com/Z3QjilA.jpg",
};

其次,我们需要一个Activity,在这里面,我们将创建一个adapter,然后把添加到ListView中。

public class UsageExampleAdapter extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_usage_example_adapter);

        listView.setAdapter(new ImageListAdapter(UsageExampleAdapter.this, eatFoodyImages));
    }
}

最后,让我们来看一下Adapter的布局文件。这个Listview的Item非常的简单:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="200dp"/>

最终结果就是展示图像集合,每一个Item都有200dp高,宽度将充满整个屏幕。很明显,这样的Gallery看上去不是特别漂亮,但这并不属于本文应该关注的重点。

在这之后,我们还应该为ListView实现一个Adapter。并尽量保证其逻辑简单,然后绑定eatfoody的示例图像到Adapter中。每个Item展示一张图片。

public class ImageListAdapter extends ArrayAdapter {
    private Context context;
    private LayoutInflater inflater;

    private String[] imageUrls;

    public ImageListAdapter(Context context, String[] imageUrls) {
        super(context, R.layout.listview_item_image, imageUrls);

        this.context = context;
        this.imageUrls = imageUrls;

        inflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (null == convertView) {
            convertView = inflater.inflate(R.layout.listview_item_image, parent, false);
        }

        Picasso
            .with(context)
            .load(imageUrls[position])
            .fit() // will explain later
            .into((ImageView) convertView);

        return convertView;
    }
}

最有趣的东西发生在ImageListAdaptergetView()方法中。你会发现Picasso的调用方式与前面讲到的“常规”加载方式一样。无论你处于什么项目中,Picasso的调用方式始终不变。

作为一个有经验的Android开发者,你可能已经想到了我们需要复用ListView中的布局,来实现快速流畅的滑动体验。Picasso有一个非常出色的特性,那就是它能够自动取消加载请求,清空ImageView上的图像,然后为适当的ImageView加载正确的图像。

边注:fit()tags()作为可选项,可用来进一步优化Adapter,我们将在接下来的文章中介绍。

Picasso的强项:缓存

当你上下滑动时,你会发现图像的展示比之前快多了。你可能已经猜到了,这些图像来自于缓存,并非再次通过网络加载。Picasso的缓存实现非常的全面,帮你把事情变得简单。缓存的大小取决设备的磁盘容量。

每当加载一张图像时。Picasso有三种加载来源:内存,磁盘和网络(顺序由快到慢)。再强调一遍,这里并没有什么是你必须要做的。在创建缓存大小方面,Picasso对你隐藏了所有的复杂细节。当然,从Picasso的实现理念来看,你可以替换缓存组件。我们将会在以后的文章中进一步了解缓存机制。

GridView

GridView的Item与ListView的实现保持无异。实际上,你可以使用同一个Adapter。只需把Activity所持有的Layout变为相应的GridView即可:

<?xml version="1.0" encoding="utf-8"?>
<GridView
    android:id="@+id/usage_example_gridview"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:numColumns="2"/>

最终展示效果如下:

其它应用:多个ImageView作为元素

至此,我们只演示了整个Adapter只有一个ImageView元素的情况。如果一个或多个ImageView作为Adapter的一小部分存在,这种方法仍然适用,只不过getView()中的代码看起来会有些不同,但是Picasso的加载方式是始终不变的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏图像识别与深度学习

《Android》Lesson05-Intent1

1236
来自专栏郭耀华‘s Blog

Android中级教程之----Log详解(Log.v,Log.d,Log.i,Log.w,Log.e)

在Android群里,经常会有人问我,Android Log是怎么用的,今天我就把从网上以及SDK里东拼西凑过来,让大家先一睹为快,希望对大家入门Androi...

36610
来自专栏向治洪

开源库BaseRecyclerViewAdapterHelper

相信大家RecyclerView应该不会陌生,大多数开发者应该都使用上它了,它也是google推荐替换ListView的控件,但是用过它的同学应该都知道它在某些...

2906
来自专栏封碎

Android自定义长按事件 博客分类: Android AndroidUP

    Android系统自带了长按事件,setOnLongClickListener即可监听。但是有时候,你不希望用系统的长按事件,比如当希望长按的时间更长一...

2372
来自专栏Android中高级开发

Android开发之漫漫长途 Ⅲ——Activity的显示之Window和View(2)

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

1163
来自专栏酷玩时刻

Android MVP 构架初试

目前讨论MVP MVVM 的架构也来越多,这种构架也很适合Android。研究MVP记录如下

3563
来自专栏项勇

笔记56 | 管理网络的使用

1666
来自专栏何俊林

记一次重构:Android实践从MVC架构到MVP架构

一直以来,想分享MVP的实战,因为很多项目开始并不是就是mvp架构的,可能是从传统的mvc结构变迁过来的。今天呈详给大家分享的这篇从mvc重构到mvp,让大家既...

2595
来自专栏Android中高级开发

Android开发之漫漫长途 Ⅱ——Activity的显示之Window和View(1)

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

692
来自专栏向治洪

android几种常见的启动模式

launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和...

2036

扫码关注云+社区

领取腾讯云代金券