Android RecyclerView通用Adapter封装

使用RecyclerView时需要设置adapter,如果每次都写一个新的adapter类势必会写很多重复的代码,也会增加不少工作量。因此封装一个通用的Adapter是非常有必要的。
1.封装通用ViewHolder

public class ViewHolder extends RecyclerView.ViewHolder {
    private SparseArray<View> mViews;
    private View mConvertView;
    private Context mContext;

    public ViewHolder(View itemView) {
        super(itemView);
    }

    public ViewHolder(View itemView, Context mContext) {
        super(itemView);
        mViews = new SparseArray<>();
        this.mConvertView = itemView;
        this.mContext = mContext;
    }

    public static ViewHolder createViewHolder(Context context, ViewGroup parent, int layoutId) {
        View convertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
        ViewHolder holder = new ViewHolder(convertView, context);
        return holder;
    }
    //一些通用方法
    public void setOnClickListener(int viewId, View.OnClickListener onClickListener){
        View view=getView(viewId);
        view.setOnClickListener(onClickListener);
    }
    public void setText(int viewId,String text){
        TextView textView=getView(viewId);
        textView.setText(text);
    }
    public void setImage(Context context,String imageUrl,int viewId){
        ImageView imageView=getView(viewId);
        Glide.with(context).load(imageUrl).apply(new RequestOptions().circleCropTransform()).into(imageView);

    }

    /**
     * 通过viewId获取控件
     *
     * @param viewId
     * @return
     */
    public <T extends View> T getView(int viewId) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }

}

2.创建support接口,声明方法

public interface MultiItemTypeSupport<T> {
    int getLayoutId(int itemType);//onCreateViewHolder方法中根据viewtype返回xml layout的ID
    int getItemViewType(int position,T t);//多种布局时返回当前ITEM的类型
    void convert(ViewHolder holder, List<T> list, int position);//onBindViewHolder中进行布局内容填充等工作
}

3.创建Adapter

public class MultiItemTypeAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
    private Context mContext;
    private List<T> list;
    private MultiItemTypeSupport<T> multiItemTypeSupport;


    public MultiItemTypeAdapter(Context mContext, List<T> list, MultiItemTypeSupport<T> multiItemTypeSupport) {
        this.mContext = mContext;
        this.list = list;
        this.multiItemTypeSupport = multiItemTypeSupport;
    }

    @Override
    public int getItemViewType(int position) {
        return multiItemTypeSupport.getItemViewType(position,list.get(position)) ;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        int layoutId=multiItemTypeSupport.getLayoutId(viewType);
        ViewHolder holder=ViewHolder.createViewHolder(mContext,parent,layoutId);
        return holder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        multiItemTypeSupport.convert(holder,list,position);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
//    protected abstract void convert(ViewHolder holder, List<T> list, int position);

}

使用:

        RecyclerView recyclerview_top;
        List<TopRvBean> toprvList;
        String imgUrl="";
        String title="title";
        TopRvBean topRvBean=new TopRvBean(imgUrl,title);
        toprvList.add(topRvBean);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerview_top.setLayoutManager(linearLayoutManager);

            MultiItemTypeAdapter adapter = new MultiItemTypeAdapter<TopRvBean>(context, toprvList, new MultiItemTypeSupport<TopRvBean>() {
            @Override
            public int getLayoutId(int itemType) {
                if (itemType == 1) {
                    return R.layout.item_top_recyclerview;
                }
                return 0;
            }

            @Override
            public int getItemViewType(int position, TopRvBean s) {
                return 1;
            }

            @Override
            public void convert(ViewHolder holder, final List<TopRvBean> list, final int position) {
                holder.setText(R.id.text,list.get(position).getTitle() );
                holder.setImage(context, list.get(position).getAvatarUrl(), R.id.image);
                holder.setOnClickListener(R.id.rl_top, new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        }
                    }
                });
            }
        });


        recyclerview_top.setAdapter(adapter);

原创来自:http://blog.csdn.net/lmj623565791/article/details/51118836/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值