Android - adapter 对 刷新控件扩展。

我们在使用上拉加载,下拉刷新的时候。

有同学会出现以下情况:
在activity 中对page 进行操作。
在每一个adapter对page 进行操作。

如果是这样的话,你们可能需要一点点

抽象思维

因为page 操作是可以抽象出来的。

作者写法

优势

减少了 重复代码时间,减少对page 操作错误率。

我就直接上代码了,一看便懂。

BaseRecyclerAdapter.class

public abstract class BaseRecyclerAdapter<T extends RecyclerView.ViewHolder, E>
        extends RecyclerView.Adapter<T> implements View.OnClickListener, View.OnLongClickListener {

    /**
     * Context
     */
    protected WeakReference<Activity> mActivity;

    /**
     * 适配器数据
     */
    protected List<E> items;

    /**
     * OnItemClickListener
     */
    private OnItemClickListener<E> mOnItemClickListener;

    /**
     * OnItemLongClickListener
     */
    private OnItemLongClickListener<E> mOnItemLongClickListener;

    /**
     * @param ctx
     */
    public BaseRecyclerAdapter(Activity ctx) {
        mActivity = new WeakReference(ctx);
    }


    @Override
    public T onCreateViewHolder(ViewGroup parent, int viewType) {
        T holder = getViewHolder(parent);
        holder.itemView.setOnClickListener(this);
        holder.itemView.setOnLongClickListener(this);
        return holder;
    }

    /**
     * 返回LayoutId
     */
    public abstract T getViewHolder(ViewGroup parent);

    @Override
    public void onBindViewHolder(T holder, int position) {
        holder.itemView.setTag(getItem(position));
    }

    /**
     * Item点击
     */
    @Override
    public void onClick(View v) {
        if (mOnItemClickListener != null) {
            mOnItemClickListener.onItemClick(v, (E) v.getTag());
        }
    }

    /**
     * LongItem点击
     */
    @Override
    public boolean onLongClick(View v) {
        if (mOnItemLongClickListener != null) {
            mOnItemLongClickListener.onItemLongClick(v, (E) v.getTag());
        }
        return false;
    }

    /**
     * 返回Item数量
     */
    @Override
    public int getItemCount() {
        return items != null ? items.size() : 0;
    }

    /**
     * 返回Item
     */
    public E getItem(int position) {
        return items != null ? items.get(position) : null;
    }

    /**
     * 返回所有Items
     *
     * @return
     */
    public List<E> getItems() {
        return items;
    }

    /**
     * 增加单个Item
     *
     * @param newItem
     */
    public void additem(E newItem) {
        if (null == items) {
            items = new ArrayList<>();
        }
        items.add(newItem);
        notifyDataSetChanged();
    }

    /**
     * 增加多个Item
     *
     * @param newItems
     */
    public void addItems(List<E> newItems) {
        if (null == items) {
            items = new ArrayList<>();
        }
        items.addAll(newItems);
        notifyDataSetChanged();
    }

    /**
     * 设置Items
     * 将原有集合内的所有元素删除
     *
     * @param newItems
     */
    public void setItems(List<E> newItems) {
        if (null == items) {
            items = new ArrayList<>();
        } else {
            items.clear();
        }
        items.addAll(newItems);
        notifyDataSetChanged();
    }

    /**
     * 删除所有Items
     */
    public void removeItems() {
        removeItems(true);
    }

    public void removeItems(boolean isNotifyDataSetChanged) {
        if (null == items) {
            return;
        }
        items.clear();
        if (isNotifyDataSetChanged) {
            notifyDataSetChanged();
        }
    }

    public void removeItem(E item) {
        if (null == items || items.isEmpty()) {
            return;
        }
        items.remove(item);
        notifyDataSetChanged();
    }

    /**
     * 返回LayoutInflater
     */
    protected LayoutInflater getLayoutInflater() {
        return LayoutInflater.from(mActivity.get());
    }


    public void setOnItemClickListener(OnItemClickListener<E> mOnItemClickListener) {
        this.mOnItemClickListener = mOnItemClickListener;
    }

    public void setOnItemLongClickListener(OnItemLongClickListener<E> mOnItemLongClickListener) {
        this.mOnItemLongClickListener = mOnItemLongClickListener;
    }

    /**
     * 点击事件
     */
    public interface OnItemClickListener<E> {

        void onItemClick(View v, E e);
    }

    /**
     * 长按事件
     */
    public interface OnItemLongClickListener<E> {

        void onItemLongClick(View v, E e);
    }
}

分页适配器 对page操作封装 PagingRecyclerAdapter.class

public abstract class PagingRecyclerAdapter<T extends RecyclerView.ViewHolder, E>
        extends BaseRecyclerAdapter<T, E> {

    // 当前页数
    private int indexPage = 0;
    // 总页数
    private int totalPage = 1;

    /**
     * @param ctx
     */
    public PagingRecyclerAdapter(Activity ctx) {
        super(ctx);
    }

    /**
     * 结束加载更多
     */
    public void finishLoadMore(int totalPage) {
        this.indexPage += 1;
        this.totalPage = totalPage;
    }

    /**
     * 设置分页参数
     *
     * @param indexPage 当前页数
     * @param totalPage 总页数
     */
    public void setPaging(int indexPage, int totalPage) {
        this.indexPage = indexPage;
        this.totalPage = totalPage;
    }

    public void setPaging(int totalPage) {
        this.indexPage += 1;
        this.totalPage = totalPage;
    }

    public int getIndexPage() {
        return indexPage;
    }

    public void setIndexPage(int indexPage) {
        this.indexPage = indexPage;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    /**
     * 重置
     */
    public void reset() {
        indexPage = 0;
        totalPage = 1;
        removeItems(false);
    }

    /**
     * 获取下一页的页号
     */
    public int getNextPage() {
        return indexPage + 1;
    }

    /**
     * 是否有更多
     */
    public boolean hasMoreItems() {
        return indexPage < totalPage;
    }
}

使用方式:
新建一个adapter 类 集成 PagingRecyclerAdapter 明确 object。
public class xxxxAdapter extends PagingRecyclerAdapter<BuyBalanceListAdapter.ViewHolder, object>

怎么搭配刷新控件啦?

public void  request(final boolean isRefresh){
        if (isRefresh) {
            adapter.reset();
        }
        Api.getInstance().getXXXApi().getList( adapter.getNextPage())
                .compose(ApiSchedulersHelper.<Response<PageResult<Object>>>io_main())
                .subscribe(new ResponseResultSubscriber<PageResult<Object>>(new FlippingLoadingDialog(mContext)) {
                    @Override
                    public boolean isShowDialog() {
                        return adapter.getIndexPage() == 0;
                    }

                    @Override
                    public void onResponse(PageResult<Object> result) {

                        if (isRefresh) {
                            adapter.setItems(result.data);
                            refreshLayout.finishRefresh();
                        } else {
                            adapter.addItems(result.data);
                            refreshLayout.finishLoadMore();
                        }
                        adapter.setPaging(result.last_page);


                       

                    }

                    @Override
                    public void onError(int errorType, String msg) {
                        super.onError(errorType, msg);
                        refreshLayout.finishLoadMore(false);
                    }
                });
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值