android recyclerview adaper封装

关于Recyclerview,是比较好用的一个控件,代替了listview和gridview,灵活性比较强。基础的就不说了,我要讲的是如何封装一个基类的recyclerview adaper

代码:

/**
 * @author:guobiaoWang on 2015/12/24
 */
public abstract class BaseRecylerAdapter extends RecyclerView.Adapter<BaseRecylerHolder> implements View.OnClickListener {
    public List<Object> mList;
    public Activity mContext;
    public RecyclerViewItemClickListener mListener;

    public BaseRecylerAdapter(Activity context, Object list) {
        this.mList = new ArrayList<>();
        //noinspection unchecked,unchecked,unchecked
        this.mList.addAll((List<Object>) list);
        this.mContext = context;
    }

    @Override
    public BaseRecylerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = getView(parent,viewType);
        return createViewHolder(view,viewType);
    }

    @Override
    public void onBindViewHolder(BaseRecylerHolder baseHolder, int position) {

    }

    @Override
    public int getItemCount() {
        if (mList != null)
            return mList.size();
        return 0;
    }

    public void setOnItemClickListner(RecyclerViewItemClickListener listner) {
        this.mListener = listner;
    }

    public abstract BaseRecylerHolder createViewHolder(View view,int viewType);

    public abstract View getView(ViewGroup parent,int viewType);
}


item回调接口:
public interface RecyclerViewItemClickListener {
    void onItemClick(View view, int position);
}


基础Holder类:
/**
 * @author:guobiaoWang on 2015/12/24
 */
public class BaseRecylerHolder extends RecyclerView.ViewHolder {
    public BaseRecylerHolder(View itemView) {
        super(itemView);
    }
}
下面是调用:大家别看实体类和布局名称,看如何实现就行了,只有一个item布局时:
public class ChatHeadAdapter extends BaseRecylerAdapter {
    public ChatHeadAdapter(Activity context, Object list) {
        super(context, list);
    }

    @Override
    public BaseRecylerHolder createViewHolder(View view, int viewType) {
        return new ChatHeadHolder(view);
    }

    @Override
    public View getView(ViewGroup parent, int viewType) {
        return LayoutInflater.from(mContext).inflate(R.layout.chat_head_item, null);
    }

    @Override
    public void onBindViewHolder(BaseRecylerHolder baseHolder, final int position) {
        ChatHeadHolder holder = (ChatHeadHolder) baseHolder;
        ChatScope chatScope = (ChatScope) mList.get(position);
        holder.name.setText(chatScope.getName());
        if (chatScope.getIcon() instanceof String)
            holder.head.setImageURI(Uri.parse(chatScope.getIcon().toString()));
        else
            holder.head.setBackgroundResource((int) chatScope.getIcon());

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onItemClick(v, position);
            }
        });
    }

    @Override
    public void onClick(View v) {

    }

    private class ChatHeadHolder extends BaseRecylerHolder {
        private SimpleDraweeView head;
        private TextView name;

        public ChatHeadHolder(View itemView) {
            super(itemView);
            head = (SimpleDraweeView) itemView.findViewById(R.id.chat_head_item_image);
            name = (TextView) itemView.findViewById(R.id.chat_head_item_name);
        }
    }
}

多个item布局时候:

package chat.adapter;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import com.blk.activity.R;
import com.blk.activity.base.BaseRecylerAdapter;
import com.blk.activity.base.BaseRecylerHolder;
import com.facebook.drawee.view.SimpleDraweeView;

import chat.model.Assistants;
import chat.model.CustomerService;

/**
 * @author:guobiaoWang on 2016/4/29
 */
public class ChatChooseContactAdapter extends BaseRecylerAdapter {

    public ChatChooseContactAdapter(Activity context, Object list) {
        super(context, list);
    }

    public enum ChatType {
        title, content;
    }

    @Override
    public int getItemViewType(int position) {
        if (mList.get(position) instanceof CustomerService) {
            return ChatType.title.ordinal();
        } else {
            return ChatType.content.ordinal();
        }
    }

    @Override
    public BaseRecylerHolder createViewHolder(View view, int viewType) {
        if (viewType == ChatType.title.ordinal()) {
            return new ContactTitleHolder(view);
        } else if (viewType == ChatType.content.ordinal()) {
            return new ContactContentHolder(view);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(BaseRecylerHolder baseHolder, final int position) {
        Object object = mList.get(position);
        if (object instanceof CustomerService) {
            ContactTitleHolder holder = (ContactTitleHolder) baseHolder;
            CustomerService customerService = (CustomerService) object;
            holder.title.setText(customerService.getMerchantsName());
            holder.address.setText(customerService.getMerchantsAddress());
        } else if (object instanceof Assistants) {
            ContactContentHolder holder = (ContactContentHolder) baseHolder;
            holder.speak.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mListener.onItemClick(v, position);
                }
            });
            Assistants assistants = (Assistants) object;
            holder.name.setText(assistants.getNickName());
        }
    }

    @Override
    public View getView(ViewGroup parent, int viewType) {
        View view = null;
        if (viewType == ChatType.title.ordinal()) {
            view = LayoutInflater.from(mContext).inflate(R.layout.chat_choose_contact_pop_title_item, null);
        } else if (viewType == ChatType.content.ordinal()) {
            view = LayoutInflater.from(mContext).inflate(R.layout.chat_choose_contact_pop_content_item, null);
        }
        return view;
    }

    @Override
    public void onClick(View v) {

    }

    private class ContactTitleHolder extends BaseRecylerHolder {
        private TextView title;
        private TextView address;

        public ContactTitleHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.chat_choose_contact_pop_title_business);
            address = (TextView) itemView.findViewById(R.id.chat_choose_contact_pop_title_address);
        }
    }

    private class ContactContentHolder extends BaseRecylerHolder {
        private SimpleDraweeView head;
        private TextView name;
        private Button speak;

        public ContactContentHolder(View itemView) {
            super(itemView);
            head = (SimpleDraweeView) itemView.findViewById(R.id.chat_choose_contact_pop_content_head);
            name = (TextView) itemView.findViewById(R.id.chat_choose_contact_pop_content_name);
            speak = (Button) itemView.findViewById(R.id.chat_choose_contact_pop_content_speak);
        }
    }

    public Assistants getAssistants(int position) throws Exception {
        if (mList.get(position) instanceof Assistants) {
            return (Assistants) mList.get(position);
        } else {
            throw new Exception();
        }
    }
}
				
时间: 2024-08-29 00:52:01

android recyclerview adaper封装的相关文章

Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类

?? Android RecyclerView单击.长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类 我写的附录文章2,介绍了Android如何基于OnItemTouchListener +GestureDetector实现单击.长按事件的监听,由于如今RecyclerView在Android开发是如此的普遍,以及RecyclerView的单击事件是如此的常用,如果像附录文章2那样把一堆事件监听写到业务逻辑代码里面,那得写

Android RecyclerView: Super Fast ListView 超级快速的Lis

Android RecyclerView: Super Fast ListView 原文来自我的微信公众号: longkai_1991 先上图,看效果: 前几天刚release完公司的一个项目,有了点时间,于是就想找一些有意思的东西学习一下,顺便运用在项目之中.看到iOS的同事们在谈论iOS8的xx特性时,我突然也有想在公司项目的下一个版本中添加Android L版本的特性. 六月底的时候收看Google io时,当时对Android新的设计语言,Material Design,没什么太大的好感

Android RecyclerView体验(一)- 简介

在网上关于RecyclerView的基本使用方式已经有了比较详细介绍,而且其设计结构也类似于ListView,所以本文将不重点介绍如何使用,在文末的引用中都可以相关内容.这里主要是介绍RecyclerView的基本功能.设计理念,以及系统提供API的情况. 什么是RecycleView RecyclerView是在Android L(也就是后来的Lollipop)中新加入的一种ViewGroup.但因为它使以support-v7库的形式加入到Android系统中,所以不仅仅是Lollipop版本

Android RecyclerView单击、长按事件标准实现:基于OnItemTouchListener + GestureDetector

?? Android RecyclerView单击.长按事件:基于OnItemTouchListener + GestureDetector标准实现 Android RecyclerView虽然拥有ListView绝大多数的功能,但Android RecyclerView却没有实现像ListView那样的点击事件.长按事件的标准实现方式,我在附录文章1中介绍的方式,实现了典型的RecyclerView的item点击事件,大致的思路是通过为RecyclerView的ViewHolder添加View

(转载)Android支付宝支付封装代码

Android支付宝支付封装代码 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-12-22我要评论 这篇文章主要介绍了Android支付宝支付封装代码,Android支付的时候肯定会使用支付宝进行支付,封装可以简化操作步骤,感兴趣的小伙伴们可以参考一下 在做Android支付的时候肯定会用到支付宝支付, 根据官方给出的demo做起来非常费劲,所以我们需要一次简单的封装. 封装的代码也很简单,就是将官网给的demo提取出一个类来方便使用. ? 1 2 3 4 5 6 7 8

android RecyclerView布局真的只是那么简单!

如今android N都已经出来了,作为一个android开发者如果还不知道如何使用android5.X的 RecyclerView未免有点说不过去了. RecyclerView比ListView更灵活,更强大.因此也会引入一些复杂性,而这些复杂性,恰恰是在新手前进道路上的很大阻碍,而笔者此文也便是希望可以给予读者一些帮助. RecyclerView是什么? 笔者个人看法,RecyclerView只是一个对ListView的升级版,这个升级的主要目的是为了让这个view的效率更高,并且使用更加方

浅谈Android RecyclerView

Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用. 个人体验来说,RecyclerView绝对是一款功能强大的控件. 首先总结下RecyclerView的特点: 1.支持不同方向,不同排版模式,实现多种展现数据的形式,涵盖了ListView,GridView,瀑布流等数据表现的形式 2.内部实现了回收机制,无需我们考虑View的复用情况 3.取消了onItemClick等点击事件,需要自己手动去写 -------------------

Android RecyclerView认知与实战

先上效果图: 左侧一个普通的Listview,没什么好说的.至于右侧,当时看到原型图第一反应是Listview+Gridview来实现(之前没使用过RecyclerView),和主管讨论后建议我使用RecyclerLiew来实现,更加灵活,定制性更高. OK,开干! 先感谢鸿洋大神的这篇博客提供的理论与技术支持 Android RecyclerView 使用完全解析 体验艺术般的控件 接下来进入正题. 分析一下需求,其实就是一个二级分类与三级分类,根据不同的type进行区分.显示数据的时候,按照

Android RecyclerView的基本使用

Android RecyclerView 在去年的Google I/O大会上就推出来了,以前经常使用的ListView 继承的是AbsListView,而RecyclerView则直接继承 ViewGroup,并实现了ScrollingView 和 NestedScrollingChild接口,RecyclerView相比ListView,是一次彻底的改变,RecyclerView 比ListView更加强大灵活. DEMO实现功能: RecyclerView的点击事件: Item及item中的