SwipeRefreshLayout加入加载更多

本文介绍了一个基于RecyclerView实现上拉加载更多的示例应用。通过自定义MyRefreshRecyclerView组件,结合SwipeRefreshLayout实现下拉刷新功能,并支持上拉加载更多数据。文章详细展示了如何设置布局、初始化组件、监听滚动事件及加载数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


MainActivity


package com.example.admin.recyclerviewtest;

import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.admin.recyclerviewtest.refresh.MyRefreshRecyclerView;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    private SwipeRefreshLayout swipeRefreshLayout;
    private MyRefreshRecyclerView recyclerView;
    private List<String> integerList = new ArrayList<>();
    private MyAdapter myAdapter;
    private Handler mHandler = new Handler();

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

    private void init() {
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_layout);
        recyclerView = (MyRefreshRecyclerView) findViewById(R.id.recycler);
        myAdapter = new MyAdapter();
        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));

        swipeRefreshLayout.setColorSchemeResources(R.color.red,
                R.color.orange,
                R.color.green,
                R.color.blue);

        swipeRefreshLayout.post(new Runnable() {
            @Override
            public void run() {
                swipeRefreshLayout.setRefreshing(true);
            }
        });
        refresh();


        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                refresh();
            }
        });

        recyclerView.setMyLoadListener(new MyRefreshRecyclerView.MyLoadListener() {
            @Override
            public void onLoadMore() {
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (integerList.size() > 25) {
                            recyclerView.setLoadMore(false);
                        } else {
                            int randomInt = new Random().nextInt(100);
                            integerList.add("上拉加载添加数字:" + randomInt);
                            myAdapter.notifyDataSetChanged();
                            recyclerView.setLoadMore(true);
                        }

                    }
                }, 1000);
            }
        });
    }

    private void getData() {
//        integerList.clear();
        Random random = new Random();
        for(int i=0;i<5;i++){
            int randomInt = random.nextInt(100);
            integerList.add(String.valueOf(randomInt));
        }
    }

    private void refresh() {
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                getData();
                recyclerView.setAdapter(myAdapter);
                myAdapter.notifyDataSetChanged();
                swipeRefreshLayout.setRefreshing(false);


            }
        }, 1500);
    }

    public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            View rootView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_refresh_recycler, parent, false);
            return new MyViewHolder(rootView);
        }

        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            holder.txt.setText(integerList.get(position));
        }

        @Override
        public int getItemCount() {
            return integerList.size();
        }
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView txt;

        public MyViewHolder(View itemView) {
            super(itemView);
            txt = (TextView) itemView.findViewById(R.id.item_txt);
        }
    }

}


Adapter

package com.example.admin.recyclerviewtest.refresh;

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

import com.example.admin.recyclerviewtest.R;

/**
 * Created by tangyangkai on 2017/1/4.
 */

public class MyRefreshAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


    private RecyclerView.Adapter adapter;
    private View footerView;
    public static final int NORMAL_VIEW_TYPE = 1;
    public static final int FOOTER_VIEW_TYPE = 2;

    public MyRefreshAdapter(RecyclerView.Adapter adapter) {
        this.adapter = adapter;
    }

    @Override
    public int getItemViewType(int position) {
        if (position == getItemCount() - 1) {
            return FOOTER_VIEW_TYPE;
        }
        return NORMAL_VIEW_TYPE;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == FOOTER_VIEW_TYPE) {
            return new RecyclerView.ViewHolder(footerView) {};
//            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_foot, parent,false);
//            return new FootViewHolder(view);

        } else {
            return adapter.onCreateViewHolder(parent, viewType);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (position == getItemCount() - 1) {
            return;
        } else {
            adapter.onBindViewHolder(holder, position);
        }

    }

    @Override
    public int getItemCount() {
        return adapter.getItemCount() + 1;
    }

    public void addFooterView(View footerView) {
        this.footerView = footerView;
    }

    static class FootViewHolder extends RecyclerView.ViewHolder {

        private TextView tv;

        public FootViewHolder(View view) {
            super(view);
            tv =  view.findViewById(R.id.tv_load);

        }
    }

}


recyclerview


package com.example.admin.recyclerviewtest.refresh;

import android.content.Context;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.example.admin.recyclerviewtest.R;

/**
 * Created by tangyangkai on 2017/1/4.
 */

public class MyRefreshRecyclerView extends RecyclerView {

    private MyRefreshAdapter myRefreshAdapter;
    private MyLoadListener myLoadListener;
    private boolean isLoadMore = true; //默认是可以向上滑动加载
    private TextView tvLoad;
    private View footView;
    private ProgressBar progressBar;
    private boolean isLoadComplete =false;


    public void setMyLoadListener(MyLoadListener myLoadListener) {
        this.myLoadListener = myLoadListener;
    }

    public MyRefreshRecyclerView(Context context) {
        super(context);
        init();
    }

    public MyRefreshRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyRefreshRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }


    private void init() {
        this.addOnScrollListener(new OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
                //停止滚动时
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    //获取最后一个完全显示Item的Position
                    int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
                    int totalItemCount = manager.getItemCount();
                    // 判断是否滚动到底部,并且不在加载状态

                    if (lastVisibleItem == (totalItemCount - 1)&&isLoadMore) {
                        isLoadMore = false;
                        tvLoad.setText("正在加载...");
                        progressBar.setVisibility(VISIBLE);
                        footView.setVisibility(VISIBLE);
                        myLoadListener.onLoadMore();
                    }
                }
            }

            /**
             * 避免没有占满全屏,就显示加载
             * dy >0 向上滚动
             * dy<0 向下滚动
             * dy==0 一般是列表数据没有占满全屏
             * @param recyclerView
             * @param dx
             * @param dy
             */
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (dy > 0) {
                    isLoadMore = true;
                } else if (dy <= 0) {
                    isLoadMore = false;
                }
                Log.d("testtest", "dx==" + dx + "dy==" + dy);
            }
        });
    }

    @Override
    public void setAdapter(Adapter adapter) {

        LinearLayout footerLayout = new LinearLayout(getContext());
        footerLayout.setGravity(Gravity.CENTER);
        footerLayout.setLayoutParams(new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, 160));
        LayoutInflater mInflater = LayoutInflater.from(getContext());
        View  view = mInflater.inflate(R.layout.item_foot, null);
        tvLoad = (TextView) view.findViewById(R.id.tv_load);
        progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
        footerLayout.addView(view);
        footView = footerLayout;
        footView.setVisibility(GONE);
        myRefreshAdapter = new MyRefreshAdapter(adapter);
        myRefreshAdapter.addFooterView(footView);
        super.setAdapter(myRefreshAdapter);

    }

    public interface MyLoadListener {
        void onLoadMore();
    }

    public void setLoadMore(boolean complete) {
        if (complete) {
            footView.setVisibility(GONE);
        } else {
            tvLoad.setText("已经全部加载完啦!");
            progressBar.setVisibility(GONE);
            myRefreshAdapter.notifyItemRemoved(myRefreshAdapter.getItemCount()+1);
        }
        isLoadComplete = complete;
    }

}


github地址 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值