RecyclerView通用adapter封装

本文旨在通过封装RecyclerView的通用Adapter,简化其实现过程。基类采用模板方法设计模式,定义了Adapter的行为,将绑定逻辑抽象到Holder中,并优化了点击事件处理,提高性能。内容包括holder基类的实现、adapter基类设计以及点击事件的抽象。同时,提供了创建adapter和holder的步骤,方便开发者快速应用。
摘要由CSDN通过智能技术生成

目的

通过封装通用adapter精简以及更加快速的完成RecyclerView实现

  • 基类通过模板方法,定义adapter行为
  • 抽象绑定逻辑,绑定操作抽象在holder中
  • holder点击事件设置,防止多次设置节约性能

实现

holder基类的实现

抽象基础bindHolder模板方法
通过bundle 传递额外参数固定方法入参

package com.android.app.commonadapter.holder;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * 
 * @param <T> 数据model泛型
 */
public abstract class AbsBaseHolder<T> extends RecyclerView.ViewHolder {

    protected Context mContext;


    public AbsBaseHolder(@NonNull View itemView) {
        super(itemView);
        mContext = itemView.getContext();
    }

    /**
     *
     * @param bean
     * @param extra 通过bundle携带adapter额外绑定配置参数用于渲染view
     * @param position
     */
    public abstract void bindHolder(T bean, Bundle extra, int position);

}

adapter 基类

  • 模板创建holder方法
  • 固化绑定holder方法
package com.android.app.commonadapter;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;

import com.android.app.commonadapter.holder.AbsBaseHolder;
import com.android.app.commonadapter.itemlistener.OnItemClickListener;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @param <T> 数据model泛型
 */
public abstract class RvAbsBaseAdapter<T> extends RecyclerView.Adapter<AbsBaseHolder<T>> {


    protected List<T> mDataList;

    protected Context mContext;

    protected OnItemClickListener<T> onItemClickListener;

    public RvAbsBaseAdapter(Context context) {
        this.mContext = context;
        mDataList = new ArrayList<>();
    }


    public void setDataList(List<T> dataList) {
        setDataList(dataList, true);
    }

    public void setDataList(List<T> dataList, boolean notifyDataSetChanged) {
        mDataList.clear();
        if (dataList != null) {
            mDataList.addAll(dataList);
        }
        if (notifyDataSetChanged) {
            notifyDataSetChanged();
        }
    }


    public void setOnItemClickListener(OnItemClickListener<T> onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    @NonNull
    @Override
    public AbsBaseHolder<T> onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        final AbsBaseHolder<T> holder = createHolder(viewGroup, i);
        if (holder == null) {
            throw new RuntimeException("createHolder can not be null");
        }
        //绑定时设置点击事件
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onItemClickListener != null && holder.getAdapterPosition() >= 0 ){
                    onItemClickListener.onItemClick(holder.itemView, mDataList.get(holder.getAdapterPosition()), holder.getAdapterPosition());
                }
            }
        });
        return holder;
    }

    /**
     * 抽象创建holder方法交给子类实现
     * @param viewGroup
     * @param i
     * @return
     */
    public abstract AbsBaseHolder<T> createHolder(@NonNull ViewGroup viewGroup, int i);

    /**
     * 统一调用holder绑定方法绑定view
     * @param tAbsBaseHolder
     * @param i
     */
    @Override
    public void onBindViewHolder(@NonNull AbsBaseHolder<T> tAbsBaseHolder, int i) {
        T bean = mDataList.get(i);
        Bundle bundle = new Bundle();
        tAbsBaseHolder.bindHolder(bean, bundle, i);
    }

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

}

adapter点击抽象

package com.android.app.commonadapter.itemlistener;

import android.view.View;

/**
 *
 * @param <T> 数据model泛型
 */
public interface OnItemClickListener<T> {
    /**
     *
     * @param view 列表item View
     * @param data 具体item model
     * @param position 位置
     */
    void onItemClick(View view, T data, int position);
}

使用

创建adapter

package com.android.app.sample.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.android.app.commonadapter.RvAbsBaseAdapter;
import com.android.app.commonadapter.holder.AbsBaseHolder;
import com.android.app.sample.R;

public class GalleryAdapter extends RvAbsBaseAdapter<String> {
    public GalleryAdapter(Context context) {
        super(context);
    }

    @Override
    public AbsBaseHolder<String> createHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_gellary, viewGroup,false);
        return new GalleryHolder(view);
    }
}

创建holder

package com.android.app.sample.adapter;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.View;

import com.android.app.commonadapter.holder.AbsBaseHolder;

public class GalleryHolder extends AbsBaseHolder<String> {
    public GalleryHolder(@NonNull View itemView) {
        super(itemView);
    }

    @Override
    public void bindHolder(String bean, Bundle extra, int position) {

    }
}

demo下载.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值