RecyclerView通用adapter封装

目的

通过封装通用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下载.

发布了26 篇原创文章 · 获赞 0 · 访问量 1135

猜你喜欢

转载自blog.csdn.net/Plx0303sunny/article/details/103405878