热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

详解Android开发技巧之PagerAdapter实现类的封装

这篇文章主要介绍了详解Android开发技巧之PagerAdapter实现类的封装,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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 extends PagerAdapter { 
  protected List mData; 
  private SparseArray mViews; 
 
  public AbstractViewPagerAdapter(List data) { 
    mData = data; 
    mViews = new SparseArray(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 mData,用于存放待填充的数据,另一个是SparseArray 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 { 
 
  public OpenResultAdapter(List 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; 
  } 
} 

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • 如何在DedeCMS专题页节点文档中调用自定义模型字段?
    在完成DedeCMS专题页节点文章列表样式的修改后,如果需要在列表中显示自定义模型的字段,由于DedeCMS默认不支持这一功能,因此需要进行一些二次开发。本文将详细介绍如何通过修改模板文件和核心文件来实现这一需求。 ... [详细]
  • 本文详细介绍了CSS中元素的显示模式,包括块元素、行内元素和行内块元素的特性和应用场景。 ... [详细]
  • 本文介绍了如何将Spring属性占位符与Jersey的@Path和@ApplicationPath注解结合使用,以便在资源路径中动态解析属性值。 ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • 作为一名新手开发者,我正在尝试使用 ASP.NET 和 Vue.js 构建一个单页面应用,涉及多个复杂组件(如按钮、图表等)。希望有经验的开发者能够提供指导。 ... [详细]
  • 深入理解Java多线程与并发机制
    本文探讨了Java多线程和并发机制的核心概念,包括多线程类的分类、执行器框架、并发容器及控制工具。通过详细解析这些组件,帮助开发者更好地理解和应用多线程技术。 ... [详细]
  • Spring 中策略模式的应用:Resource 接口详解
    本文探讨了在 Spring 框架中如何利用 Resource 接口实现资源访问策略。Resource 接口作为资源访问策略的抽象,通过多种实现类支持不同类型的资源访问。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
author-avatar
bj_gqdy_342
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有