ViewPager是android的support库中的一个控件,也是一个在许多应用开发中都用得比较多的控件。目前为止,对ViewPager的使用,我一般是用ViewPager + Fragment的组合,偶尔也有ViewPager加View的组合。关于ViewPager + Fragment的使用,已经有FragmentAdapter的实现可以帮助我们快速进行开发了,但是每次使用ViewPager + View都要自己去继承PagerAdapter并实现,重写那些我们写过一次又一次的方法,于是决定对其进行封装。

代码如下:

/*
 * Date: 14-8-18
 * Project: Access-Control-V2
 */
package cn.irains.access_control_v2.common;

import android.support.v4.view.PagerAdapter;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

/**
 * 抽象的PagerAdapter实现类,封装了内容为View的公共操作.
 * Author: msdx (645079761@qq.com)
 * Time: 14-8-18 下午2:34
 */
public abstract class AbstractViewPagerAdapter<T> extends PagerAdapter {
    protected List<T> mData;
    private SparseArray<View> mViews;

    public AbstractViewPagerAdapter(List<T> data) {
        mData = data;
        mViews = new SparseArray<View>(data.size());
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View view = mViews.get(position);
        if (view == null) {
            view = newView(position);
            mViews.put(position, view);
        }
        container.addView(view);
        return view;
    }

    public abstract View newView(int position);

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(mViews.get(position));
    }

    public T getItem(int position) {
        return mData.get(position);
    }
}

在该类中,使用了泛型来支持它的扩展复用。然后是定义了两个成员变量,一个是List<T> mData,用于存放待填充的数据,另一个是SparseArray<View> mView,用于存放已经初始化的每个位置的view,key是其对应的位置。

在该抽象类中,定义了一个抽象方法:public abstract View newView(int position);用于在从mView中取不到对应的view时,从这里创建。

而关于instantiateItem方法的实现则很简单,如下:

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View view = mViews.get(position);
        if (view == null) {
            view = newView(position);
            mViews.put(position, view);
        }
        container.addView(view);
        return view;
    }

先从mViews中取出对应的view,如果取不到就调用newView(position)来创建,并加入mViews,如果取到了,就加进容器中,并返回。

在该类中,还新增了一个getItem(int position)的方法,用于返回对应位置的对象。

封装之后,以后使用起来就很方便了,直接继承这个类,并实现newView(int position)的抽象方法,如下:

    class OpenResultAdapter extends AbstractViewPagerAdapter<OpenResult> {

        public OpenResultAdapter(List<OpenResult> data) {
            super(data);
        }

        @Override
        public View newView(int position) {
            View view = View.inflate(mContext, R.layout.view_remote_capture, null);
            ImageView imageView = (ImageView) view.findViewById(R.id.image_view);
            UIUtil.setLayoutParamsHeight(imageView, R.dimen.padding_common, 4, 3);
            imageView.setAdjustViewBounds(true);
            mImageLoader.displayImage(UrlUtil.imageUrl(getItem(position).getImgUrl()), imageView);
            return view;
        }
    }

是不是感觉代码简洁了很多呢?

Android开发技巧——PagerAdapter实现类的封装的更多相关文章

  1. Android开发技巧——PagerAdapter的再次简单封装

    这次再对内容为View的ViewPager的适配器PagerAdapter进行简单的封装,支持List数据和SparseArray的数据,带更新视图功能. 首先,先贴上最上面的抽象类代码: /* * ...

  2. Android开发技巧——PagerAdapter再简单的包

    再次内容View的ViewPager该适配器PagerAdapter简包,支持List数据与SparseArray数据.随着更新的浏览功能. 首先,首先贴上顶部抽象类代码: /* * Date: 14 ...

  3. Android开发技巧——ViewPager加View情况封装PagerAdapter的实现类

    ViewPager是Android的support库中的一个控件. ViewPager + Fragment的使用,已经有FragmentAdapter的实现可以帮助我们快速进行开发了: ViewPa ...

  4. Android开发技巧——大图裁剪

    本篇内容是接上篇<Android开发技巧--定制仿微信图片裁剪控件> 的,先简单介绍对上篇所封装的裁剪控件的使用,再详细说明如何使用它进行大图裁剪,包括对旋转图片的裁剪. 裁剪控件的简单使 ...

  5. Android开发技巧——使用PopupWindow实现弹出菜单

    在本文当中,我将会与大家分享一个封装了PopupWindow实现弹出菜单的类,并说明它的实现与使用. 因对界面的需求,android原生的弹出菜单已不能满足我们的需求,自定义菜单成了我们的唯一选择,在 ...

  6. Android开发技巧——自定义控件之自定义属性

    Android开发技巧--自定义控件之自定义属性 掌握自定义控件是很重要的,因为通过自定义控件,能够:解决UI问题,优化布局性能,简化布局代码. 上一篇讲了如何通过xml把几个控件组织起来,并继承某个 ...

  7. Android开发技巧——自定义控件之组合控件

    Android开发技巧--自定义控件之组合控件 我准备在接下来一段时间,写一系列有关Android自定义控件的博客,包括如何进行各种自定义,并分享一下我所知道的其中的技巧,注意点等. 还是那句老话,尽 ...

  8. Android开发技巧——实现可复用的ActionSheet菜单

    在上一篇<Android开发技巧--使用Dialog实现仿QQ的ActionSheet菜单>中,讲了这种菜单的实现过程,接下来将把它改成一个可复用的控件库. 本文原创,转载请注明出处: h ...

  9. Android开发技巧——自定义控件之增加状态

    Android开发技巧--自定义控件之增加状态 题外话 这篇本该是上周四或上周五写的,无奈太久没写博客,前几段把我的兴头都用完了,就一拖再拖,直到今天.不想把这篇拖到下个月,所以还是先硬着头皮写了. ...

随机推荐

  1. vue学习中v-if和v-show一起使用的问题

    v-if和v-show一起使用 在开发项目过程中v-if和v-show一起使用时,接下面跟着的v-else会在页面上面显示两次 .代码如下: <tbody class="sortabl ...

  2. RESTful Console Application

    RESTful Console Application Introduction Inspirited by RESTFul architecture, A console application t ...

  3. 一个页面从输入url到页面加载显示完成,中间都经历了什么

    第一种解释: 一般会经历以下几个过程: 1.首先,在浏览器地址栏中输入url 2.浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容.若没有,则跳到第三步操作. 3 ...

  4. Java网络爬虫Hello world实现——Httpclient爬取百度首页

    1.创建Maven项目 2.Httpclient Maven地址 <dependency> <groupId>org.apache.httpcomponents</gro ...

  5. ResizeObserver - 元素resize监听API

    Motivation 响应式网站/Web应用程序 根据视口大小调整内容展示方式.这通常通过CSS和media查询来完成.当CSS表现不好我们会使用Javascript. 比如document.addE ...

  6. Java中的内存分配

    Java程序在运行时,需要在内存中分配空间,为了提高效率,就对空间进行了不同区域的划分,因为每一片区域否有特定的处理数据方式和内存管理方式. 1.栈存储局部变量 2.堆存储new出来的东西 3.方法区 ...

  7. golang 线程与通道

    首先我们来看线程,在golang里面也叫goroutine 在读这篇文章之前,我们需要了解一下并发与并行.golang的线程是一种并发机制,而不是并行.它们之间的区别大家可以上网搜一下,网上有很多的介 ...

  8. SpringBatch的核心组件JobLauncher和JobRepository

    Spring Batch的框架包括启动批处理作业的组件和存储Job执行产生的元数据.因此只需掌握配置这个基础框架在批处理应用程序中即启动Jobs并存储Job元数据. 组件:Job Launcher和J ...

  9. Sencha EXTJS6的 Eclipse 插件安装指南

    Sencha EXTJS的 Eclipse 插件安装指南 (翻译:苏生米沿) 本文地址:http://blog.csdn.net/sushengmiyan/article/details/52566 ...

  10. 我的第一本著作:Spark技术内幕上市!

    现在各大网站销售中! 京东:http://item.jd.com/11770787.html 当当:http://product.dangdang.com/23776595.html 亚马逊:http ...