RecyclerView万能适配器

转载请申明:http://blog.csdn.net/yoyo_newbie/article/details/48130813

没次当我们用RecyclerView是时候,不得不想到要添加点击事件, 头部,尾部,甚至分组繁琐代码烦恼,于是本人就无奈写了共用的adapter。

使用说明:

如,item资源为

R.layout.fragment_jiongtu_item_of_indexfregment

item里面有个imageview id为

R.id.iv_photo
private  class JionTuAdapter extends BaseRecyclerViewAdapter
{

   public JionTuAdapter(Context context) {
      super(context);
   }

   @Override
   protected int getContentResourse() {
      return R.layout.fragment_jiongtu_item_of_indexfregment;
   }

   @Override
   protected int[] setContentViewsIds() {
      return new int[]{R.id.iv_photo};
   }

   int i = 0;

   @Override
   protected void onContentViewUpdate(BaseRecyclerViewAdapter adapter, View view, Object object) {
      //这个object就是ItemType.data
      ImageView photoView = (ImageView) adapter.getContentViewItemViewById(R.id.iv_photo);
      photoView.setImageResource((Integer) object);
   }
}

这样,我就可以轻松实现了这个适配器!

然后,测试


recyclerView.setAdapter(adapter = new JionTuAdapter(getActivity()));

//添加内容点击事件
adapter.setOnContentViewListener(new BaseRecyclerViewAdapter.OnContentViewListener() {
   @Override
   public void onClicked(View view, BaseRecyclerViewAdapter adapter, Object object) {
      Snackbar.make(view,"呵呵",Snackbar.LENGTH_SHORT).show();
   }
});

List<JionTuAdapter.ItemType> list = new ArrayList<JionTuAdapter.ItemType>(); for(int i =0; i < 10;i++) { //把数据都添加到内容列表

 list.add(new BaseRecyclerViewAdapter.ItemType(BaseRecyclerViewAdapter.ItemType.TYPE_CONTENT,R.drawable.ic_launcher));

} adapter.update(list, false);//false代表不需要提前清空列表

如果要添加头部,类似上面的adapter,分别实现

getHeaderResourse
setHeaderViewsIds
onHeaderViewUpdate

三个方法。如果没有id,记得提供null

http://blog.csdn.net/yoyo_newbie/article/details/48108417


/**
 * 首页的囧图
 * @author Sam
 *
 * 下午3:17:39
 */
public class JiongTuFragmentOfIndexFragment extends Fragment {

   public View convertView;
   private PullToRefreshStaggeredGridLayout videosList;
   private JionTuAdapter adapter;
   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
         Bundle savedInstanceState) {

      convertView =  inflater.inflate(R.layout.fragment_jiongtu_of_indexfregment, container, false);
      init(convertView);
      return convertView;
   }

   private void init(View convertView) {
      videosList = (PullToRefreshStaggeredGridLayout) convertView.findViewById(R.id.lv_index_jiongtu);
   }

   @Override
   public void onResume() {
      super.onResume();
      RecyclerView recyclerView = videosList.getRefreshableView();
      recyclerView.setAdapter(adapter = new JionTuAdapter(getActivity()));
      adapter.setOnContentViewListener(new BaseRecyclerViewAdapter.OnContentViewListener() {
         @Override
         public void onClicked(View view, BaseRecyclerViewAdapter adapter, Object object) {
            Snackbar.make(view,"呵呵",Snackbar.LENGTH_SHORT).show();
         }
      });

      List<JionTuAdapter.ItemType> list = new ArrayList<JionTuAdapter.ItemType>();
      for(int i =0; i < 10;i++)
      {
         //把数据都添加到内容列表
         list.add(new BaseRecyclerViewAdapter.ItemType(BaseRecyclerViewAdapter.ItemType.TYPE_CONTENT,null));
      }
      adapter.update(list, false);//false代表不需要提前清空列表
   }

   private  class JionTuAdapter extends BaseRecyclerViewAdapter
   {

      public JionTuAdapter(Context context) {
         super(context);
      }

      @Override
      protected int getContentResourse() {
         return R.layout.fragment_jiongtu_item_of_indexfregment;
      }

      @Override
      protected int[] setContentViewsIds() {
         return new int[]{R.id.iv_photo};
      }

      int i = 0;

      @Override
      protected void onContentViewUpdate(BaseRecyclerViewAdapter adapter, View view, Object object) {
         //这个object就是ItemType.data
         ImageView photoView = (ImageView) adapter.getContentViewItemViewById(R.id.iv_photo);
         photoView.setImageResource(i++%2==0?R.mipmap.dota2_meizi1:R.mipmap.dota2_meizi2);
      }
   }

}

万能适配器

/**
 * 自定義RecyelerView Adapter
 */
public  abstract  class BaseRecyclerViewAdapter extends RecyclerView.Adapter
{
    private Context context;
    public BaseRecyclerViewAdapter(Context context)
    {
        this.context = context;
        initHeaderViewsIds();
        initFooterViewsIds();
        initContentViewsIds();
        initContentViewsGroupIds();
    }
    private List<ItemType> itemTypes = new ArrayList<ItemType>();
    protected  int  getFooterResourse()
    {

        return -1;
    }

    protected  int getHeaderResourse()
    {
        return -1;
    }
    protected abstract int getContentResourse();
    protected   int getContentGroupResourse()
    {
        return  -1;
    }
    protected  int[] setHeaderViewsIds()
    {
        return null;
    }
    protected  int[] setFooterViewsIds()
    {
        return null;
    }
    protected abstract int[] setContentViewsIds();
    protected  int[] setContentViewsGroupIds()
    {
        return null;
    }
    protected abstract  void onContentViewUpdate(BaseRecyclerViewAdapter adapter, View view,Object object);

    private Map<Integer, View> headerViews = new HashMap<Integer, View>();
    private Map<Integer, View> contentViews = new HashMap<Integer, View>();
    private Map<Integer, View> contentViewGroups = new HashMap<Integer, View>();
    private Map<Integer, View> footViews = new HashMap<Integer, View>();
    public void update( List<ItemType> itemTypes, boolean isClear )
    {
        if(itemTypes.isEmpty())
            return;
        if(isClear)
            itemTypes.clear();
        this.itemTypes.addAll(itemTypes);
        notifyDataSetChanged();
    }

    public List<ItemType> getItemTypes()
    {
        return  itemTypes;
    }

    private void initHeaderViewsIds()
    {
        int [] ids = setHeaderViewsIds();
        if(null == ids)
            return;
        for (int id : ids)
        {
            headerViews.put(id, null);
        }
    }

    private void initFooterViewsIds()
    {
        int[] ids = setFooterViewsIds();
        if(null == ids)
            return;
        for (int id : ids)
        {
            footViews.put(id, null);
        }
    }

    private void initContentViewsIds()
    {
        int[] ids  =  setContentViewsIds();
        if(null == ids)
            return;
        for (int id : ids)
        {
            contentViews.put(id, null);
        }
    }

    private void initContentViewsGroupIds()
    {
        int[] ids = setContentViewsGroupIds();
        if(null == ids)
            return;
        for (int id : ids)
        {
            contentViewGroups.put(id, null);
        }
    }

    private  class HeaderViewHolder extends  RecyclerView.ViewHolder{

        public HeaderViewHolder(View itemView) {
            super(itemView);
            loadViews(itemView, headerViews);
            itemView.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v) {
                    if(null !=    BaseRecyclerViewAdapter.this.headerViewViewListener)

                        BaseRecyclerViewAdapter.this.headerViewViewListener.onClicked(v, BaseRecyclerViewAdapter.this, v.getTag());
                }
            });
        }
    }

    private  class FooterViewHolder extends  RecyclerView.ViewHolder{

        public FooterViewHolder(View itemView) {
            super(itemView);
            loadViews(itemView, footViews);
            itemView.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v) {
                    if(null !=  BaseRecyclerViewAdapter.this.footerViewListener)
                        BaseRecyclerViewAdapter.this.footerViewListener.onClicked(v, BaseRecyclerViewAdapter.this, v.getTag());
                }
            });
        }
    }

    protected    void onHeaderViewUpdate(BaseRecyclerViewAdapter adapter, View view, Object object)
    {

    }

    protected   void onFooterViewUpdate(BaseRecyclerViewAdapter adapter, View view,Object object)
    {

    }

    protected   void onContentViewGroupUpdate(BaseRecyclerViewAdapter adapter, View view,Object object)
    {

    }

    private  class  ContentViewHolder  extends  RecyclerView.ViewHolder{

        public ContentViewHolder(View itemView) {
            super(itemView);
            loadViews(itemView, contentViews);
            if(itemView instanceof AdapterView)
                return;
            itemView.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v) {
                    if(null !=  BaseRecyclerViewAdapter.this.contentViewListener)
                        BaseRecyclerViewAdapter.this.contentViewListener.onClicked(v, BaseRecyclerViewAdapter.this, v.getTag());
                }
            });
        }
    }

    private  class ContentViewGroupHolder extends  RecyclerView.ViewHolder{

        public ContentViewGroupHolder(View itemView) {
            super(itemView);
            loadViews(itemView, contentViewGroups);
            itemView.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v) {
                    if(null !=  BaseRecyclerViewAdapter.this.contentGroupViewListener)
                        BaseRecyclerViewAdapter.this.contentGroupViewListener.onClicked(v, BaseRecyclerViewAdapter.this, v.getTag());
                }
            });
        }
    }

    private void loadViews(View itemView,  Map<Integer, View> views)
    {
        if(!views.isEmpty())
        {
            Set<Map.Entry<Integer, View>> set = views.entrySet();
            for(Map.Entry<Integer, View> integerEntry : set)
            {
                views.put(integerEntry.getKey(),itemView.findViewById(integerEntry.getKey()));
            }
        }
    }

    public interface  OnFooterViewListener
    {
        void onClicked(View view, BaseRecyclerViewAdapter adapter, Object object);
    }

    public interface  OnHeaderViewViewListener
    {
        void onClicked(View view, BaseRecyclerViewAdapter adapter, Object object);
    }

    public interface  OnContentViewListener
    {
        void onClicked(View view, BaseRecyclerViewAdapter adapter, Object object);
    }

    public interface  OnContentGroupViewListener
    {
        void onClicked(View view, BaseRecyclerViewAdapter adapter, Object object);
    }

    public OnFooterViewListener footerViewListener;
    public void setOnFooterViewListener(OnFooterViewListener footerViewListener)
    {
        this.footerViewListener = footerViewListener;
    }

    public OnHeaderViewViewListener headerViewViewListener;

    public void  setOnHeaderViewViewListener(OnHeaderViewViewListener headerViewViewListener)
    {
        this.headerViewViewListener = headerViewViewListener;
    }

    public OnContentViewListener contentViewListener;

    public void setOnContentViewListener (OnContentViewListener contentViewListener)
    {
        this.contentViewListener = contentViewListener;
    }

    public OnContentGroupViewListener contentGroupViewListener;

    public void setOnContentGroupViewListener(OnContentGroupViewListener contentGroupViewListener)
    {
        this.contentGroupViewListener = contentGroupViewListener;
    }

    public View getHeaderItemViewById(int id)
    {
        return headerViews.get(id);
    }

    public View getContentViewItemViewById(int id)
    {
        return contentViews.get(id);
    }

    public View getContentViewGroupViewById(int id)
    {
        return contentViewGroups.get(id);
    }

    public View getFooterViewById(int id)
    {
        return footViews.get(id);
    }

   @Override
    public final RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) {
       switch (type)
       {
           case ItemType.TYPE_HEADER:
           {
                return new HeaderViewHolder(LayoutInflater.from(this.context).inflate(getHeaderResourse(), viewGroup, false));
           }
           case ItemType.TYPE_CONTENT:
           {
               View view = LayoutInflater.from(this.context).inflate(getContentResourse(), viewGroup, false);
               return new ContentViewHolder(LayoutInflater.from(this.context).inflate(getContentResourse(), viewGroup, false));
           }
           case ItemType.TYPE_CONTENT_GROUP:
           {
               return new ContentViewGroupHolder(LayoutInflater.from(this.context).inflate(getContentGroupResourse(), viewGroup, false));
           }
           case ItemType.TYPE_FOOTER:
           {
               return new FooterViewHolder(LayoutInflater.from(this.context).inflate(getFooterResourse(), viewGroup, false));
           }
       }
        return null;
    }

    @Override
    public final void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        ItemType itemType =  itemTypes.get(position);
        if(null != itemType.data)
            viewHolder.itemView.setTag(itemType.data);
        switch (itemType.type)
        {
            case ItemType.TYPE_HEADER:
            {
                onHeaderViewUpdate(this, viewHolder.itemView,itemType.data);
            }break;
            case ItemType.TYPE_CONTENT:
            {
                onContentViewUpdate(this,viewHolder.itemView,itemType.data);
            }break;
            case ItemType.TYPE_CONTENT_GROUP:
            {
                onContentViewGroupUpdate(this,viewHolder.itemView,itemType.data);
            }break;
            case ItemType.TYPE_FOOTER:
            {
                onFooterViewUpdate(this, viewHolder.itemView,itemType.data);
            }break;
        }
    }

    @Override
    public final int getItemCount() {
        return itemTypes.size();
    }

    @Override
    public final int getItemViewType(int position) {
        return itemTypes.get(position).type;
    }

    public  final  static class ItemType
    {
        public ItemType(int type)
        {
            this.type = type;
        }

        public ItemType(int type, Object data)
        {
            this.type = type;
            this.data = data;
        }
        public int type;
        public Object data;

        /**
         * 头部
         */
        public static final int TYPE_HEADER = 0x01;
        /**
         * 列表内容
         */
        public static final int TYPE_CONTENT = 0x02;

        /**
         * 尾部
         */
        public static final int TYPE_FOOTER = 0x03;

        /**
         * 分组
         */
        public static final int TYPE_CONTENT_GROUP = 0x04;
    }

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 18:13:46

RecyclerView万能适配器的相关文章

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

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

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

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

Android进阶笔记10:Android 万能适配器

1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都需要去继承一个BaseAdapter,然后实现里面的一大堆方法,而我们每次最关心的无非就是getView方法,其余的方法几乎都是相同代码.这里是不是就可以优化起来呢?在其次,我们在使用Adapter的时候,为了优化性能,常常会创建一个Holder.而Holder里面每次存放的都是View,对Hole

万能适配器的一些问题

不用万能适配器volley都能搞定如果用万能适配器则不能用volley(因为万能适配器里边有自己的settag)可以用NUtils在 NUtils里边自定义三级缓存每次设图片时都去访问三级缓存 1 package com.example.wannengadapter; 2 3 import java.util.List; 4 5 import android.content.Context; 6 import android.view.LayoutInflater; 7 import andro

Android开发之万能适配器

ListView.GridView等等非常多的东西都需要适配器.而如果开发一个app每一个listview都有写一个Adapter的话,那还怎么愉快的玩游戏.. 什么是ViewHolider以及的用法和为什么要用? 这位博主写的非常好. http://www.cnblogs.com/lichenwei/p/4085107.html 所谓的万能适配器,无非是将适配器的重复代码抽取出来进行封装.不同功能的代码则留写一个方法留给用户复写,则每个listview的适配器就只变成几句话就够了. 这是一般适

慕课网 万能适配器学习笔记

首先再次感谢 慕课网的技术大牛分享了该课程. 一.传统 ListView 适配器的模式:1. 创建Listview,并为listview 创建item布局2.封装数据 3.为Item布局创建特定的适配器 用于数据展示.(在这过程中,如果某一个ListView 的item中控件过多,控件的生命及调用会导致代码量上升,而如果一个app中有很多个地方需要用到ListView 时,需要分别写多个适配器,会导致很多重复性的操作,为了避免这种情况的发生,让编码更轻松,可参考 慕课网Android万能适配器

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

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

安卓开发笔记——打造万能适配器(Adapter)

为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需要,因此我们时常要去继承BaseAdapter类去实现一个自定义的适配器来满足我们的场景需要. 如果你是开发一个简单点的APP还好,可能ListView和GridView的数量不会太多,我们只要去写几个BaseAdapter实现类就可以了. 但如果有一天,你需要开发一个APP里面具有几十个ListV

万能适配器

初学Android,通过网上视频.资料整理了万能适配器的编写,记录一下,方便以后使用. CommonAdapter public abstract class CommonAdapter<T> extends BaseAdapter { protected Context mContext; protected List<T> mDatas; protected LayoutInflater mInflater; private int layoutId; public Commo