android仿Adapter实现自定义PagerAdapter方法示例

 更新时间:2017年11月16日 11:57:39   作者:君莫醉  
这篇文章主要给大家介绍了关于android仿Adapter实现自定义PagerAdapter的相关资料,文中详细介绍了关于PagerAdapter的用法,对大家的理解和学习具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

PagerAdapter简介

PagerAdapter是android.support.v4包中的类,它的子类有FragmentPagerAdapter, FragmentStatePagerAdapter,这两个adapter都是Fragment的适配器,用于实现Fragment的滑动效果,这两个adapter的使用和区别这次就先不介绍了,等下次有时间再做详细的介绍。

PagerAdapter主要是viewpager的适配器,而viewPager则也是在android.support.v4扩展包中新添加的一个强大的控件,可以实现控件的滑动效果,比如咱们在软件中常见的广告栏的滑动效果,用viewPager就可以实现。今天主要介绍如何使用viewPagr并重写PagerAdapter实现常见广告栏的滑动效果。

PagerAdapter用法简介

首先,如果继承pageradapter,至少必须重写下面的四个方法

      1. instantiateItem(ViewGroup, int)

      2. destroyItem(ViewGroup, int, Object)

      3. getCount()

      4. isViewFromObject(View, Object)

下面我们以代码的形式,说明这四个方法的含义以及如何使用

private class ViewPagerAdapter extends PagerAdapter { 
 
    // 获取要滑动的控件的数量,在这里我们以滑动的广告栏为例,那么这里就应该是展示的广告图片的ImageView数量 
    @Override 
    public int getCount() { 
      return images.size(); 
    } 
 
    // 来判断显示的是否是同一张图片,这里我们将两个参数相比较返回即可 
    @Override 
    public boolean isViewFromObject(View arg0, Object arg1) { 
      return arg0 == arg1; 
    } 
 
    // PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁 
    @Override 
    public void destroyItem(ViewGroup view, int position, Object object) { 
      view.removeView(images.get(position)); 
    } 
 
    // 当要显示的图片可以进行缓存的时候,会调用这个方法进行显示图片的初始化,我们将要显示的ImageView加入到ViewGroup中,然后作为返回值返回即可 
    @Override 
    public Object instantiateItem(ViewGroup view, int position) { 
      view.addView(images.get(position)); 
      return images.get(position); 
    } 
  } 

实现了这四个方法,就可以实现滑动的效果了。

android仿Adapter实现自定义PagerAdapter

最近在开发中,为增加PagerAdapter的可用性与可读性,自定义了一下PagerAdapter

public abstract class EjBasePagerAdapter<T> extends PagerAdapter {

 protected List<T> list;
 protected SparseArray<EjBasePagerHolder<T>> sparseArray;

 public EjBasePagerAdapter(List<T> list){
  this.list = list;
  sparseArray = new SparseArray<>();
 }

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

 public String getIcon(int position){
  return null;
 }

 @Override
 public Object instantiateItem(ViewGroup container, int position) {
  EjBasePagerHolder<T> holder = sparseArray.get(getSparsePosition(position));
  if(null == holder){
   holder = onBundHolder(container);
   holder.setPosition(position);
   holder.bindDada(list.get(position),position);
   sparseArray.put(getSparsePosition(position),holder);
  }
  View view = holder.itemView;
  container.addView(view);
  return view;
 }

 @Override
 public void notifyDataSetChanged() {
  sparseArray.clear();
  super.notifyDataSetChanged();
 }

 protected int getSparsePosition(int position){
  return (position+10)*2;
 }

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

 protected View inflate(int resorce, ViewGroup viewGroup) {
  return LayoutInflater.from(viewGroup.getContext()).inflate(resorce, viewGroup, false);
 }

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

 protected abstract EjBasePagerHolder<T> onBundHolder(ViewGroup container);

 public void onDestroy(){

 }

 public void onActivityResult(int requestCode, int resultCode, Intent data) {

 }

 protected abstract class EjBasePagerHolder<D>{
  /**上下文*/
  protected Context mContext;
  private int position;

  SparseArray<View> sparseArray;
  View itemView;

  protected EjBasePagerHolder(View itemView){
   this.itemView = itemView;
   this.mContext = itemView.getContext();
   sparseArray = new SparseArray<>();
   initView();
  }

  public abstract void initView();

  public View findViewById(int id){
   View view = sparseArray.get(id);
   if(null == view){
    view = itemView.findViewById(id);
    sparseArray.append(id,view);
   }
   return view;
  }

  public abstract void bindDada(D t,int position);

  public void onActivityResult(int requestCode, int resultCode, Intent data) {

  }

  public void setPosition(int position) {
   this.position = position;
  }

  public int getPosition() {
   return position;
  }

  public void onDestroy(){
   sparseArray.clear();
  }
 }
}

简单用法

public class EjMainFmtBannerPagerAdapter extends EjBasePagerAdapter<EjMainFragmentDataBean>{

 public EjMainFmtBannerPagerAdapter(List<EjMainFragmentDataBean> list) {
  super(list);
 }

 @Override
 protected EjBasePagerHolder<EjMainFragmentDataBean> onBundHolder(ViewGroup container) {
  return new EjBasePagerHolder<EjMainFragmentDataBean>(LayoutInflater.from(container.getContext()).inflate(R.layout.ejmain_item_fmt_banner,null)) {

   private ImageView ejmain_iv_banner;

   @Override
   public void initView() {
    ejmain_iv_banner = (ImageView)findViewById(R.id.ejmain_iv_banner);
   }

   @Override
   public void bindDada(EjMainFragmentDataBean t, int position) {
    GlidUtil.loadUrl(t.img1,ejmain_iv_banner,mContext);
   }
  };
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Android手机显示多彩霓虹灯效果

    Android手机显示多彩霓虹灯效果

    这篇文章主要为大家详细介绍了Android手机显示多彩霓虹灯效果的小实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • android通过jxl读excel存入sqlite3数据库

    android通过jxl读excel存入sqlite3数据库

    本文主要介绍了android通过jxl去读excel的内容,然后存入sqlite3数据库表,需要用到jxl的jar包和sqlite 的jar包,图片是excel的数据格式,需要的朋友可以参考下
    2014-03-03
  • Android开发强制横屏和强制竖屏设置实例代码

    Android开发强制横屏和强制竖屏设置实例代码

    本篇文章主要介绍了Android开发强制横屏和强制竖屏设置实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Android自定义View之渐变色折线图的实现

    Android自定义View之渐变色折线图的实现

    折线图的实现方法在github上有很多开源的程序,但是对于初学者来讲,简单一点的教程可能更容易入门,下面这篇文章主要给大家介绍了关于Android自定义View之渐变色折线图的相关资料,需要的朋友可以参考下
    2022-04-04
  • Android移动应用开发指南之六种布局详解

    Android移动应用开发指南之六种布局详解

    Android应用界面要美观好看,就需要运用到一定的布局技术,Android布局是不可忽视的,是android应用界面开发的重要一环,这篇文章主要给大家介绍了关于Android移动应用开发指南之六种布局的相关资料,需要的朋友可以参考下
    2022-09-09
  • Android实现拼多多地址选择器

    Android实现拼多多地址选择器

    这篇文章主要为大家详细介绍了Android实现拼多多地址选择器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • android scrollview 滑动到顶端或者指定位置的实现方法

    android scrollview 滑动到顶端或者指定位置的实现方法

    下面小编就为大家带来一篇android scrollview 滑动到顶端或者指定位置的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Android 进程间通信AIDL使用详解

    Android 进程间通信AIDL使用详解

    本篇文章主要介绍了Android 进程间通信AIDL使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Android新浪微博下拉刷新(最新消息显示在最上面)

    Android新浪微博下拉刷新(最新消息显示在最上面)

    查看最新消息要用到类似新浪微博下拉刷新,想必这个功能很多的朋友都会使用吧,下面与大家分享下具体的实现方法,感兴趣的朋友可以参考下哈
    2013-05-05
  • Android监听键盘状态获取键盘高度的实现方法

    Android监听键盘状态获取键盘高度的实现方法

    这篇文章主要给大家介绍了关于Android监听键盘状态获取键盘高度的实现方法,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12

最新评论