分页基础适配器

public abstract class BasePageAdapter<T, K extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<K> {

    protected LayoutInflater inflater;
    protected Context context;
    protected List<T> listData;

    private int spanRow = 1; // 行数
    private int spanColumn = 7; // 每页列数

    private int itemWidth = 0;
    private int itemCount = 0;
    private int pageMargin = 0; // 页间距

    private BaseRecyclerAdapter.OnItemClickListener onItemClickListener;
    private BaseRecyclerAdapter.OnClickListener onClickListener;

    public BasePageAdapter(Context context, List<T> listData) {
        this.context = context;
        this.listData = listData;
        this.inflater = LayoutInflater.from(context);
        itemCount = listData.size() + spanRow * spanColumn;
        initListener();
    }

    /**
     * 初始化listener
     */
    private void initListener() {
        onClickListener = new BaseRecyclerAdapter.OnClickListener() {
            @Override
            public void onClick(int position, long itemId) {
                if (onItemClickListener != null)
                    onItemClickListener.onItemClick(position, itemId);
            }
        };
    }

    @Override
    public K onCreateViewHolder(ViewGroup parent, int viewType) {
        if (itemWidth <= 0) {
            // 计算Item的宽度
            itemWidth = (parent.getWidth() - pageMargin * 2) / spanColumn;
        }
        final K holder = onCreateCustomViewHolder(parent, viewType);
        if (holder != null) {
            holder.itemView.setTag(holder);
            holder.itemView.setOnClickListener(onClickListener);
        }
        holder.itemView.measure(0, 0);
        holder.itemView.getLayoutParams().width = itemWidth;
        holder.itemView.getLayoutParams().height = holder.itemView.getMeasuredHeight();
        return holder;
    }

    @Override
    public void onBindViewHolder(K holder, int position) {
        if (null == holder) return;
        if (spanColumn == 1) {
            // 每个Item距离左右两侧各pageMargin
            holder.itemView.getLayoutParams().width = itemWidth + pageMargin * 2;
            holder.itemView.setPadding(pageMargin, 0, pageMargin, 0);
        } else {
            int m = position % (spanRow * spanColumn);
            if (m < spanRow) {
                // 每页左侧的Item距离左边pageMargin
                holder.itemView.getLayoutParams().width = itemWidth + pageMargin;
                holder.itemView.setPadding(pageMargin, 0, 0, 0);
            } else if (m >= spanRow * spanColumn - spanRow) {
                // 每页右侧的Item距离右边pageMargin
                holder.itemView.getLayoutParams().width = itemWidth + pageMargin;
                holder.itemView.setPadding(0, 0, pageMargin, 0);
            } else {
                // 中间的正常显示
                holder.itemView.getLayoutParams().width = itemWidth;
                holder.itemView.setPadding(0, 0, 0, 0);
            }
        }

        if (position < listData.size()) {
            holder.itemView.setVisibility(View.VISIBLE);
            onBindCustomViewHolder(holder, position);
        } else {
            holder.itemView.setVisibility(View.INVISIBLE);
        }
    }

    public int getPageCount() {
        return itemCount;
    }

    @Override
    public int getItemCount() {
        return null == listData ? 0 : listData.size();
    }

    public abstract K onCreateCustomViewHolder(ViewGroup parent, int viewType);

    public abstract void onBindCustomViewHolder(K h, int position);


    public interface OnItemClickListener {
        void onItemClick(int position, long itemId);
    }

    /**
     * 添加项点击事件
     *
     * @param onItemClickListener the RecyclerView item click listener
     */
    public void setOnItemClickListener(BaseRecyclerAdapter.OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    /**
     * 可以共用同一个listener,相对高效
     */
    public static abstract class OnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            RecyclerView.ViewHolder holder = (RecyclerView.ViewHolder) v.getTag();
            onClick(holder.getAdapterPosition(), holder.getItemId());
        }

        public abstract void onClick(int position, long itemId);
    }

    public void replaceItem(T item) {
        if (null != listData) {
            listData.clear();
            listData.add(item);
        }
    }

    public void replaceItem(List<T> items) {
        if (null != listData) {
            listData.clear();
            listData.addAll(items);
        }
    }

    public void addItem(T item) {
        if (null != listData) listData.add(item);
    }

    public void addItem(List<T> items) {
        if (null != listData) listData.addAll(items);
    }

    public void deleteItem(int position) {
        if (null != listData && null != listData.get(position)) listData.remove(position);
    }

    public void deleteItem(T item) {
        if (null != listData) listData.remove(item);
    }

    public void clearItem() {
        if (null != listData) listData.clear();
    }

    public void refresh() {
        notifyItemChanged(listData.size() - 1);
    }

}
posted @ 2018-12-17 09:17  journeyIT  阅读(34)  评论(0)    收藏  举报