RecyclerView上拉加载更多,下拉刷新


1:这个是自定义的view,实现了
RecyclerView 
功能,

package com.charles.refreshloadrecyclerview;import android.content.Context;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup;import static com.charles.refreshloadrecyclerview.SwipeAdapter.NO_MORE;/** * Created by C_harles on 2017/11/15. */public class SwipeRecyclerView extends SwipeRefreshLayout implements SwipeRefreshLayout.OnRefreshListener { private RecyclerView recyclerView; private OnLoadRefreshListener onLoadRefreshListener; private boolean isRefresh; private boolean isLoad; private SwipeAdapter swipeAdapter; private LinearLayoutManager linearLayoutManager; public SwipeRecyclerView(Context context) { super(context); this.init(); } public SwipeRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); this.init(); } public void setOnLoadRefreshListener(OnLoadRefreshListener onLoadRefreshListener) { this.onLoadRefreshListener = onLoadRefreshListener; this.recyclerView.addOnScrollListener(new EndLessOnScrollListener(onLoadRefreshListener, this)); } private void init() { this.recyclerView = new RecyclerView(this.getContext()); this.addView(this.recyclerView); this.setOnRefreshListener(this); this.setRefresh(isRefresh); this.linearLayoutManager = new LinearLayoutManager(getContext()) { public RecyclerView.LayoutParams generateDefaultLayoutParams() { return new RecyclerView.LayoutParams(LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); } }; this.recyclerView.setLayoutManager(this.linearLayoutManager); } public LinearLayoutManager getLinearLayoutManager() { return linearLayoutManager; } /** * 刷新完成 */ public void stopRefresh() { if (swipeAdapter == null) return; this.isRefresh = false; this.swipeAdapter.viewType = NO_MORE; this.setRefreshing(this.isRefresh); } /** * 加载完成 */ public void stopLoad() { if (swipeAdapter == null) return; this.isLoad = false; this.swipeAdapter.viewType = NO_MORE; this.setEnabled(!this.isLoad); ;//可以刷新 } public void setRefresh(boolean refresh) { this.isRefresh = refresh; this.setEnabled(this.isRefresh); this.setRefreshing(this.isRefresh); if (!isLoad && isRefresh && onLoadRefreshListener != null) onLoadRefreshListener.onRefresh(); } public void setLoad(boolean load) { this.isLoad = load; if (this.isLoad) {//禁止刷新 this.setRefresh(false); } } public boolean isLoad() { return isLoad; } public void setAdapter(RecyclerView.Adapter adapter) { if (adapter instanceof SwipeAdapter) { swipeAdapter = (SwipeAdapter) adapter; swipeAdapter.setSwipeRecyclerView(this); } this.recyclerView.setAdapter(adapter); } @Override public void onRefresh() { if (onLoadRefreshListener != null) { this.setRefresh(true); onLoadRefreshListener.onRefresh(); } } public SwipeAdapter getSwipeAdapter() { return swipeAdapter; } public RecyclerView getRecyclerView() { return recyclerView; } }



2:自定义适配器

package com.charles.refreshloadrecyclerview;

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

/**
 * Created by C_harles on 2017/11/15.
 */

public abstract class SwipeAdapter<VH extends ViewHolder> extends RecyclerView.Adapter<VH> {

    //上拉加载更多
    static final int PULL_LOAD_MORE = 10000;
    //正在加载更多
    static final int LOADING_MORE = 10001;
    //没有更多
    static final int NO_MORE = 10002;

    int viewType = NO_MORE;

    private SwipeRecyclerView swipeRecyclerView;

    public void setSwipeRecyclerView(SwipeRecyclerView swipeRecyclerView) {
        this.swipeRecyclerView = swipeRecyclerView;
    }

    @Override
    public final VH onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == PULL_LOAD_MORE || viewType == LOADING_MORE)
            return (VH) new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.footer_layout, null));
        else
            return onCreateViewHolders(parent, viewType);
    }

    @Override
    public final int getItemViewType(int position) {
        if (swipeRecyclerView != null) {
            if (getItemCounts() == position)
                return viewType;
        }
        return getItemViewTypes(position);
    }

    public int getItemViewTypes(int position) {
        return super.getItemViewType(position);
    }

    @Override
    public final int getItemCount() {
        if (swipeRecyclerView != null) {
            if (viewType == PULL_LOAD_MORE || viewType == LOADING_MORE) {
                return getItemCounts() + 1;
            }
        }
        return getItemCounts();
    }

    public abstract int getItemCounts();

    public abstract VH onCreateViewHolders(ViewGroup parent, int viewType);

    @Override
    public final void onBindViewHolder(VH holder, int position) {
        int type = getItemViewType(position);
        if (type == PULL_LOAD_MORE) {
            holder.setProgressBarShow(View.GONE);
            holder.setTextViewText("上拉加载更多");
        } else if (type == LOADING_MORE) {
            holder.setProgressBarShow(View.VISIBLE);
            holder.setTextViewText("正在加载更多");
        } else {
            this.onBindViewHolders(holder, position);
        }
    }

    public abstract void onBindViewHolders(VH holder, int position);


}


3:自定义 ViewHaodler
package com.charles.refreshloadrecyclerview;

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * Created by C_harles on 2017/11/15.
 */

public class ViewHolder extends RecyclerView.ViewHolder {

    private ProgressBar progressBar;

    private TextView textView;

    public ViewHolder(View itemView) {
        super(itemView);
        this.progressBar = (ProgressBar) itemView.findViewById(R.id.progress);
        this.textView = (TextView) itemView.findViewById(R.id.textShow);
    }

    public final void setProgressBarShow(int visibility) {
        if (this.progressBar != null)
            this.progressBar.setVisibility(visibility);
    }

    public final void setTextViewText(Character character) {
        if (this.textView != null)
            this.textView.setText(character);
    }

    public final void setTextViewText(String character) {
        if (this.textView != null)
            this.textView.setText(character);
    }
}

4:刷新接口
package com.charles.refreshloadrecyclerview;

/**
 * Created by C_harles on 2017/11/16.
 */

public interface OnLoadRefreshListener {

    void onRefresh();

    void onLoad();

}
5:这块是回调加载更多



package com.charles.refreshloadrecyclerview;

import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import static com.charles.refreshloadrecyclerview.SwipeAdapter.LOADING_MORE;
import static com.charles.refreshloadrecyclerview.SwipeAdapter.NO_MORE;
import static com.charles.refreshloadrecyclerview.SwipeAdapter.PULL_LOAD_MORE;

/**
 * Created by C_harles on 2017/11/16.
 */

public class EndLessOnScrollListener extends RecyclerView.OnScrollListener {

    private OnLoadRefreshListener onLoadRefreshListener;

    private SwipeRecyclerView swipeRecyclerView;

    private LinearLayoutManager linearLayoutManager;

    private SwipeAdapter adapter;

    private int dy;

    public EndLessOnScrollListener(OnLoadRefreshListener onLoadRefreshListener, SwipeRecyclerView swipeRecyclerView) {
        this.onLoadRefreshListener = onLoadRefreshListener;
        this.swipeRecyclerView = swipeRecyclerView;
        if (swipeRecyclerView == null)
            return;
        this.adapter = this.swipeRecyclerView.getSwipeAdapter();
        this.linearLayoutManager = swipeRecyclerView.getLinearLayoutManager();
    }

    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (newState != RecyclerView.SCROLL_STATE_IDLE)//不动时
            return;
        if (swipeRecyclerView == null || linearLayoutManager == null || adapter == null)
            return;
        if (this.swipeRecyclerView.isRefreshing())//正在刷新的话禁止加载更多
            return;
        if (linearLayoutManager.findLastVisibleItemPosition() + 1 < adapter.getItemCount())
            return;

//        if (linearLayoutManager.getChildCount() == adapter.getItemCount()) {
//            Log.i("sss","----------------");
//            return;
//        }
        if (onLoadRefreshListener != null && !swipeRecyclerView.isLoad()) {
            if (adapter.viewType == NO_MORE) {//上拉加载更多
                adapter.viewType = PULL_LOAD_MORE;
                adapter.notifyDataSetChanged();
            } else if (adapter.viewType == PULL_LOAD_MORE) {//加载更多
                adapter.viewType = LOADING_MORE;
                swipeRecyclerView.setLoad(true);
                onLoadRefreshListener.onLoad();
                adapter.notifyDataSetChanged();
            }//正在在加载
        }
    }
}



6:加载更多的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="horizontal"
    android:padding="10dp"><ProgressBar
        android:id="@+id/progress"
        android:layout_width="18dp"
        android:layout_height="18dp" />

    <TextView
        android:id="@+id/textShow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:text="正在加载"
        android:textColor="#999999"
        android:textSize="16sp" />

</LinearLayout>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值