RecyclerView分页加载

recyclerview分页加载,需要重写OnScrollListener。
activity:

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private MainAdapter adapter;
    private ProgressBar progressBar;

    private int page = 0;
    private List<People> peopleList;
    private int index = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);
        progressBar = findViewById(R.id.progressBar);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        adapter = new MainAdapter(this);
        recyclerView.setAdapter(adapter);
        recyclerView.addOnScrollListener(new LoadMoreOnScrollListener(linearLayoutManager) {
            @Override
            public void onLoadMore(int currentPage) {
                if (currentPage > page) {
                    delay();
                }
            }
        });

        peopleList = new ArrayList<>();

        delay();
    }

    private void delay() {
        progressBar.setVisibility(View.VISIBLE);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1500);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            progressBar.setVisibility(View.GONE);
                            getData();
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private void getData() {
        for (int i=0; i < 30; i++) {
            People people = new People();
            people.setName("name:" + index);
            people.setAge(index);
            peopleList.add(people);
            index++;
        }
        page++;
        adapter.setData(peopleList);
    }
}

核心类LoadMoreOnScrollListener

package com.example.myapplication.listener;

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

public abstract class LoadMoreOnScrollListener extends RecyclerView.OnScrollListener {

    private LinearLayoutManager mLinearLayoutManager;

    private int currentPage = 1;

    /**
     * 已经加载出来的item个数
     */
    private int totalItemCount;

    /**
     * 上一个totalItemCount
     */
    private int previousTotal = 0;

    /**
     * 屏幕上可见item个数
     */
    private int visibleItemCount;

    /**
     * 屏幕可见item的第一个
     */
    private int firstVisiableItem;

    /**
     * 是否正在上拉数据
     */
    private boolean isPulling = true;

    public LoadMoreOnScrollListener(LinearLayoutManager linearLayoutManager) {
        this.mLinearLayoutManager = linearLayoutManager;
    }

    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        // 可见item个数
        visibleItemCount = recyclerView.getChildCount();
        // item总数
        totalItemCount = mLinearLayoutManager.getItemCount();
        // 第一个可见item
        firstVisiableItem = mLinearLayoutManager.findFirstVisibleItemPosition();

        if (isPulling) {
            if (totalItemCount > previousTotal) {
                // 数据成功获取才会执行 说明数据已经加载结束
                isPulling = false;
                previousTotal = totalItemCount;
            }
        }

        //如果获取数据失败,则不会这行此处,因为loading始终为true
        //当最后一个item可见时,执行加载
        if (!isPulling && totalItemCount - visibleItemCount <= firstVisiableItem) {
            currentPage ++;
            onLoadMore(currentPage);
            isPulling = true;
        }
    }

    public abstract void onLoadMore(int currentPage);
}
RecyclerView 分页加载显示可以通过以下步骤实现: 1. 在 RecyclerView 中设置一个滚动监听(OnScrollListener),以便在滚动过程中检测是否需要加载更多数据。 2. 定义一个接口(OnLoadMoreListener),当 RecyclerView 滚动到底部时会调用这个接口的方法,以便在这个方法中加载更多数据。 3. 在 RecyclerView 的适配器中添加一个 Loading View,用于显示正在加载的状态。 4. 当需要加载更多数据时,显示 Loading View,并调用 OnLoadMoreListener 接口的方法来加载更多数据。 5. 加载完成后,隐藏 Loading View,并更新 RecyclerView 的数据集。 以下是一个简单的示例代码: ```java public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private final int VIEW_TYPE_ITEM = 0; private final int VIEW_TYPE_LOADING = 1; private List<MyData> mDataList; private OnLoadMoreListener mOnLoadMoreListener; private boolean mIsLoading = false; public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) { mOnLoadMoreListener = onLoadMoreListener; } @Override public int getItemViewType(int position) { return mDataList.get(position) == null ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == VIEW_TYPE_LOADING) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_loading, parent, false); return new LoadingViewHolder(view); } else { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_data, parent, false); return new DataViewHolder(view); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof DataViewHolder) { MyData data = mDataList.get(position); ((DataViewHolder) holder).bindData(data); } else if (holder instanceof LoadingViewHolder) { ((LoadingViewHolder) holder).showLoading(); if (!mIsLoading && mOnLoadMoreListener != null) { mIsLoading = true; mOnLoadMoreListener.onLoadMore(); } } } @Override public int getItemCount() { return mDataList.size(); } public void setData(List<MyData> dataList) { mDataList = dataList; notifyDataSetChanged(); } public void addData(List<MyData> dataList) { mDataList.addAll(dataList); notifyDataSetChanged(); mIsLoading = false; } public static class DataViewHolder extends RecyclerView.ViewHolder { private TextView mTextView; public DataViewHolder(View itemView) { super(itemView); mTextView = itemView.findViewById(R.id.text_view); } public void bindData(MyData data) { mTextView.setText(data.getText()); } } public static class LoadingViewHolder extends RecyclerView.ViewHolder { private ProgressBar mProgressBar; public LoadingViewHolder(View itemView) { super(itemView); mProgressBar = itemView.findViewById(R.id.progress_bar); } public void showLoading() { mProgressBar.setVisibility(View.VISIBLE); } } public interface OnLoadMoreListener { void onLoadMore(); } } ``` 在 Activity 或 Fragment 中,你需要设置 RecyclerView 的 LayoutManager 和 Adapter,并在 Adapter 中设置 OnLoadMoreListener 接口。 ```java public class MyFragment extends Fragment implements MyAdapter.OnLoadMoreListener { private RecyclerView mRecyclerView; private MyAdapter mAdapter; private LinearLayoutManager mLayoutManager; private List<MyData> mDataList = new ArrayList<>(); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); mRecyclerView = view.findViewById(R.id.recycler_view); mAdapter = new MyAdapter(); mAdapter.setOnLoadMoreListener(this); mLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setAdapter(mAdapter); loadData(); return view; } private void loadData() { // load data from server or database // add the loaded data to mDataList mAdapter.setData(mDataList); } @Override public void onLoadMore() { // load more data from server or database // add the loaded data to mDataList mAdapter.addData(mDataList); } } ``` 这样,当用户滑动到 RecyclerView 的底部时,就会触发 onLoadMore() 方法来加载更多数据。同时,RecyclerView 会自动显示 Loading View 来提示用户正在加载数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值