Android适配器之定义PagerAdapter万能适配器

一般使用pageAdapter需要实现getcount、isViewFromObject、instantiateItem、destroyItem等默认函数,其实完全可以抽取共有代码到父类当中。

/** * Created by Xiaoxuan948 on 2015/10/27. * Desc: * 提示:先给adapter设置数据,再绑定适配器    setAdapter会调用instantiateItem方法 */public class AbsUnityBasePageAdapter<T> extends PagerAdapter implements INotifyAdapterDataSetChange {    private static final UtilsLog lg = UtilsLog.getLogger(AbsUnityBasePageAdapter.class.getSimpleName());    private LayoutInflater layoutInflater;

private IAdapterDataModifyHelper<T> IAdapterataModifyHelper;

public AbsUnityBasePageAdapter() {        this.IAdapterataModifyHelper = new DataModifyHelper<>();    }

public IAdapterDataModifyHelper<T> getDataModifyHelper() {        this.IAdapterataModifyHelper.setNotifyAdapterDataSetChange(this);        return IAdapterataModifyHelper;    }

@Override    public void notifyAdapter() {        lg.e("notifyAdapter with dataSize:" + this.IAdapterataModifyHelper.getDataResources().size());        notifyDataSetChanged();    }

/*PagerAdapter默认必须实现方法*/    @Override    public boolean isViewFromObject(View view, Object object) {        lg.e("isViewFromObject:" + (view == object ? "true" : "false"));        return view == object;    }

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

@Override    public Object instantiateItem(ViewGroup container, int position) {        if (layoutInflater == null) {            layoutInflater = LayoutInflater.from(container.getContext());        }        if (position >= IAdapterataModifyHelper.getDataResources().size()) {            lg.e("修正position:instantiateItem failed for position:" + position + " out of size:" + IAdapterataModifyHelper.getDataResources().size());            position = position % getDataModifyHelper().getDataResources().size();        }

lg.e("generateItemView for position:" + position);        View itemView = generateItemView(IAdapterataModifyHelper.getDataResources().get(position), layoutInflater, position);        container.addView(itemView);        return itemView;    }

@Override    //不调用会报错    public void destroyItem(ViewGroup container, int position, Object object) {        lg.e("destroyItem:" + position);        container.removeView((View) object);    }

/*自定义的抽象方法:基于Position构建View对象*/    protected View generateItemView(T itemEntity, LayoutInflater layoutInflater, int position) {        if (itemEntity instanceof View) {            return (View) IAdapterataModifyHelper.getDataResources().get(position);        } else {            throw new NullPointerException("DataResource Type is not View,so child class must Override");        }    }}

其中,IAdapterataModifyHelper当中封装对数据的增删改查等操作,并且已内部处理空指针异常。

instantiateItem中国,首先通过数组是否越界矫正position,调用generateItemView方法生成View对象并添加至container当中。在generateItemView实现当中,默认实现会判断当前数据集是否为View的集合,否则抛出异常,这里主要是为了强制开发人员重写generateItemView根据itemEntity生成View对象。

业务层使用方式如下:

adapter = new AbsUnityBasePageAdapter<String>() {

@Override    protected View generateItemView(String itemEntity, LayoutInflater layoutInflater, int position) {        lg.e("ViewPagerLabBaseAdapter generateItemView with position :" + position);        View itemRootView = layoutInflater.inflate(R.layout.simple_item_vertical, null);        ViewFindHelper viewFindHelper = new ViewFindHelper(itemRootView);        ImageView imgItemCommon = viewFindHelper.generateView(R.id.imgItemCommon);        imgItemCommon.setScaleType(ImageView.ScaleType.CENTER_CROP);        Glide.with(layoutInflater.getContext()).load(itemEntity).into(imgItemCommon);        return itemRootView;    }};

adapter.getDataModifyHelper().setDataResource(        "http://tupian.enterdesk.com/2013/mxy/12/10/15/3.jpg",        "http://pic1.nipic.com/2008-11-13/2008111384358912_2.jpg",        "http://img4.imgtn.bdimg.com/it/u=1249974208,2325623016&fm=21&gp=0.jpg",        "http://img0.imgtn.bdimg.com/it/u=1918423052,1540132432&fm=21&gp=0.jpg");vpActViewPager.setAdapter(adapter);

来自为知笔记(Wiz)

时间: 2024-12-30 10:49:58

Android适配器之定义PagerAdapter万能适配器的相关文章

Android适配器之DataModifyHelper数据操作类的封装

编写适配器代码时常常被以下几个问题所困扰: 1.业务层和适配器中对同一组数据进行维护,难以管理 2.在业务层针对数据进行修改后必须通知适配器更新,否则提示The content of the adapter has changed but ListView did not receive anotification 3.业务层修改数据时充斥大量的非空&数据标准化等冗余代码 针对前两个问题,可以将数据交由适配器去管理,业务层对数据的增删改查均通过适配器进行处理,这样仅需要维护好adapter中的数

打造android偷懒神器———RecyclerView的万能适配器

转载请注明出处谢谢:http://www.cnblogs.com/liushilin/p/5720926.html 很不好意思让大家久等了,本来昨天就应该写这个的,无奈公司昨天任务比较紧,所以没能按时给大家带来RecyclerView的适配器,楼主对期待的小伙伴表示最深刻地歉意. 如果你没有看前面的万能的ListView,GridView等的万能适配器,楼主推荐你去看一看,当然,大牛就免了. 另外,楼主今天在构思这个RecyclerView的过程中发现前天写的ListView有点毛病,现在楼主已

Android之ListView性能优化——万能适配器

如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有觉得有什么不好的.直到最近在慕课网上看到鸿洋大神讲的“机器人小慕”和“万能适配器”两节课,才对BaseAdapter有所了解.看了鸿洋大神的课程之后,我又上网搜了几个博客,也看了一些源码和文档,于是打算写一个帖子来记录一下自己的学习历程. 在今天的帖子中,我们从一个最基本的实现BaseAdapter

Android适配器之基于BaseAdapter定义AbslistView万能适配器

为统一数据相关操作,现给出数据处理相关操作的接口定义,其中包含对列表数据的增删改查等常规操作. /** * Created by Administrator on 2016/4/19. * 适配器的数据修改方法的定义 */public interface IAdapterDataModifyHelper<T> { /** * 通知适配器更新界面 * * @param INotifyDataSetChange*/void setNotifyAdapterDataSetChange(INotify

[转]Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段

收藏ArrayAdapter.SimpleAdapter和BaseAdapter的一些简短代码片段,希望用时方便想起其用法. 1.ArrayAdapter 只可以简单的显示一行文本 代码片段: [java] view plaincopy ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, R.layout.item,//只能有一个定义了id的TextView data);//data既可以是数组,也可以是Li

Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段(转)

摘自:http://blog.csdn.net/shakespeare001/article/details/7926783 收藏ArrayAdapter.SimpleAdapter和BaseAdapter的一些简短代码片段,希望用时方便想起其用法. 1.ArrayAdapter 只可以简单的显示一行文本 代码片段: [java] view plaincopy ArrayAdapter<String> adapter = new ArrayAdapter<String>( this

Xamarin.Android 使用 SimpleAdapter 打造 ListView 万能适配器

第一步:创建 layout1.axml 来展示列表详细内容 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="matc

RecyclerView的万能适配器+定义可以到底部自动刷新的RecyclerView

RecyclerView的重要性就不做重复说明了,为了方便以后直接使用写了这个,主要有: 万能适配器在使用的时候分为定义布局和绑定数据,方便直接套用.加入了底部刷新,需要配合自己写的RecyclerView一起使用,对于布局中各个子布局和控件可以做到响应各种点击事件: 首先抽取ViewHolder:这里的要点是用到了SparseArray(源码中类似ArrayList.直接使用Object数组进行实现): package com.fightzhao.baseadapterdemo.base; i

Android 快速开发系列 打造万能的ListView GridView 适配器

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38902805 ,本文出自[张鸿洋的博客] 1.概述 相信做Android开发的写得最多的就是ListView,GridView的适配器吧,记得以前开发一同事开发项目,一个项目下来基本就一直在写ListView的Adapter都快吐了~~~对于Adapter一般都继承BaseAdapter复写几个方法,getView里面使用ViewHolder模式,其实大部分的代码基本都是类似的