alicx / LoadMoreRecyclerView

业务发开中的一个demo,RecyclerView实现,支持下拉刷新,上拉自动加载,瀑布流及线性流切换
Apache License 2.0
91 stars 49 forks source link

将继承 RecyclerView 改为继承 RecyclerView.Adapter 来实现 #7

Open cairurui opened 7 years ago

cairurui commented 7 years ago

实现是通过继承 RecyclerView 来实现的,其中 adapter 似乎不能使用正常的方法了。一个改成继承 RecyclerView.Adapter 来实现。

cairurui commented 7 years ago

just like this:

package com.leaf8.alicx.loadmorerecycler.dummy;

import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.leaf8.alicx.loadmorerecycler.R;

/**
 * Created by CaiRR on 2017-5-8.
 */

public abstract class BaseLoadMoreAdapter extends RecyclerView.Adapter<BaseLoadMoreAdapter.BaseViewHolder> {

    private RecyclerView mRecyclerView;
    public final static int TYPE_NORMAL = 0;
    public final static int TYPE_HEADER = 1;//头部--支持头部增加一个headerView
    public final static int TYPE_FOOTER = 2;//底部--往往是loading_more
    public final static int TYPE_LIST = 3;//代表item展示的模式是list模式
    public final static int TYPE_STAGGER = 4;//代码item展示模式是网格模式

    private boolean mIsFooterEnable = false;//是否允许加载更多
    private boolean mIsHeaderEnable;
    private int mHeaderResId;
    private boolean mIsLoadingMore;
    private int mLoadMorePosition;
    private LoadMoreListener mListener;

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        mRecyclerView = recyclerView;

        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (null != mListener && mIsFooterEnable && !mIsLoadingMore && dy > 0) {
                    int lastVisiblePosition = getLastVisiblePosition();
                    // TODO 提前进入加载更多操作
                    if (lastVisiblePosition + 1 == getItemCount()) {
                        setLoadingMore(true);
                        mLoadMorePosition = lastVisiblePosition;
                        mListener.onLoadMore();
                    }
                }
            }
        });
    }

    public void setLoadMoreListener(LoadMoreListener listener) {
        mListener = listener;
    }

    public void setLoadingMore(boolean loadingMore) {
        this.mIsLoadingMore = loadingMore;
    }

    /**
     * 获取最后一条展示的位置
     *
     * @return
     */
    private int getLastVisiblePosition() {
        int position;
        if (mRecyclerView.getLayoutManager() instanceof LinearLayoutManager) {
            position = ((LinearLayoutManager) mRecyclerView.getLayoutManager()).findLastVisibleItemPosition();
        } else if (mRecyclerView.getLayoutManager() instanceof GridLayoutManager) {
            position = ((GridLayoutManager) mRecyclerView.getLayoutManager()).findLastVisibleItemPosition();
        } else if (mRecyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {
            StaggeredGridLayoutManager layoutManager = (StaggeredGridLayoutManager) mRecyclerView.getLayoutManager();
            int[] lastPositions = layoutManager.findLastVisibleItemPositions(new int[layoutManager.getSpanCount()]);
            position = getMaxPosition(lastPositions);
        } else {
            position = mRecyclerView.getLayoutManager().getItemCount() - 1;
        }
        return position;
    }

    private int getMaxPosition(int[] positions) {
        int size = positions.length;
        int maxPosition = Integer.MIN_VALUE;
        for (int i = 0; i < size; i++) {
            maxPosition = Math.max(maxPosition, positions[i]);
        }
        return maxPosition;
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_HEADER) {
            return new HeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(
                    mHeaderResId, parent, false));
        }
        if (viewType == TYPE_FOOTER) {
            return new FooterViewHolder(
                    LayoutInflater.from(parent.getContext()).inflate(
                            R.layout.list_foot_loading, parent, false));
        } else { // type normal
            return setupOnCreateViewHolder(parent, viewType);
        }
    }

    abstract BaseViewHolder setupOnCreateViewHolder(ViewGroup parent, int viewType);

    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {
        int type = getItemViewType(position);
        if (type != TYPE_FOOTER && type != TYPE_HEADER) {
            setupOnBindViewHolder(holder, position);
        }
    }

    abstract void setupOnBindViewHolder(RecyclerView.ViewHolder holder, int position);

    @Override
    public int getItemViewType(int position) {
        int headerPosition = 0;
        int footerPosition = getItemCount() - 1;

        if (headerPosition == position && mIsHeaderEnable && mHeaderResId > 0) {
            return TYPE_HEADER;
        }
        if (footerPosition == position && mIsFooterEnable) {
            return TYPE_FOOTER;
        }
        /**
         * 这么做保证layoutManager切换之后能及时的刷新上对的布局
         */
        if (mRecyclerView.getLayoutManager() instanceof LinearLayoutManager) {
            return TYPE_LIST;
        } else if (mRecyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {
            return TYPE_STAGGER;
        } else {
            return TYPE_NORMAL;
        }
    }

    public class FooterViewHolder extends BaseViewHolder {

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

    public class HeaderViewHolder extends BaseViewHolder {
        public HeaderViewHolder(View itemView) {
            super(itemView);
        }
    }

    @Override
    public int getItemCount() {
        int count = setupGetItemCount();
        if (mIsFooterEnable) count++;
        if (mIsHeaderEnable) count++;
        return count;
    }

    abstract int setupGetItemCount();

    public void setHeaderEnable(boolean enable) {
        mIsHeaderEnable = enable;
    }

    public void addHeaderView(int resId) {
        mHeaderResId = resId;
    }

    public interface LoadMoreListener {
        void onLoadMore();
    }

    public void setAutoLoadMoreEnable(boolean autoLoadMore) {
        mIsFooterEnable = autoLoadMore;
    }

    public void notifyMoreFinish(boolean hasMore) {
        setAutoLoadMoreEnable(hasMore);
        notifyItemRemoved(mLoadMorePosition);
        mIsLoadingMore = false;
    }

    public abstract class BaseViewHolder extends RecyclerView.ViewHolder {
        public BaseViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onItemClick(v, getAdapterPosition());
                }
            });
        }

        public void onItemClick(View view, int position) {
            if (mOnItemClickListener != null) {
                mOnItemClickListener.onItemClick(view, position);
            }
        }
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mOnItemClickListener = listener;

    }

    private OnItemClickListener mOnItemClickListener;

    public interface OnItemClickListener {
        void onItemClick(View view, int position);
    }
}