RecyclerView的下拉刷新,头部,尾部

本文介绍如何使用RecyclerView实现上拉加载更多与下拉刷新功能,包括使用SwipeRefreshLayout进行下拉刷新,并通过监听滚动状态实现加载更多。文中详细展示了代码实现过程。

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

许许多多的项目都开始从ListView转到RecyclerView,那么,上拉加载和下拉刷新是一件很有必要的事情。

今天我们写RecyclerView的下拉刷新,头部,尾部,。

我们看一下效果图:

SwipeRefreshLayout实现很简单,重点是滑动到底部自动加载应该如何实现,其实其实现的方式类似于ListView的实现方式。

 看我们需要导的包

//recyclerview列表
implementation 'com.android.support:recyclerview-v7:26.1.0'
看一下activity布局文件:布局文件就两个控件,SwipeRefreshLayout中嵌套RecyclerView。
<?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:orientation="vertical">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/recyclerView_SwipeRefresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#d9d9d9"
            android:padding="20dp">

        </android.support.v7.widget.RecyclerView>
    </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>

在代码中初始化RecyclerView以及实现adapter等,。就直接上代码了,。

public class RecyclerView1Activity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener{
    private RecyclerView recyclerView;
    private List<String> list = new ArrayList<>();;
    private  RecyclerView1Adapter recyclerView1Adapter;
    private SwipeRefreshLayout swipeRefreshLayout;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what==1) {
                recyclerView1Adapter.notifyDataSetChanged();
                recyclerView1Adapter.isLoadComplet = true;
            }else{
                swipeRefreshLayout.setRefreshing(false);
            }
        }
    };

    @Override
    public void onRefresh() {
        initNet();
        initData();
        handler.sendEmptyMessageDelayed(2,2000l);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recyclerview);
        recyclerView = findViewById(R.id.recyclerview);
        swipeRefreshLayout = findViewById(R.id.recyclerView_SwipeRefresh);

        swipeRefreshLayout.setRefreshing(true);//让刷新的动画显示出来
        onRefresh();//刚进入的时候,主动调用刷新回调接口
        swipeRefreshLayout.setOnRefreshListener(this);

        //做加载更多的监听的方法
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                LinearLayoutManager linearLayoutManager1 = (LinearLayoutManager)recyclerView.getLayoutManager();
                int lastIndex =linearLayoutManager1.findLastVisibleItemPosition();
                int countItem = linearLayoutManager1.getItemCount();           
                    //1-正在滑动,2滑动到最后一个,3是否加载完成
                if(newState == RecyclerView.SCROLL_STATE_IDLE && lastIndex==countItem-1 && recyclerView1Adapter.isLoadComplet){
                    //进入加载的方法
                    recyclerView1Adapter.isLoadComplet = false;
                    //获取网络数据,加载更多的
                    initNet();
                    handler.sendEmptyMessageDelayed(1,2000l);

                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
            }
        });

    }
    public void initNet(){
        for(int i=0;i<20;i++){
            list.add(i+"");
        }
    }
    public void initData(){
        //设置分割线
//        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
//        dividerItemDecoration.setDrawable(ContextCompat.getDrawable(this,R.drawable.recycler_divider));
//        recyclerView.addItemDecoration(dividerItemDecoration);
        //设置间距
//        recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
//            @Override
//            public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
//                super.getItemOffsets(outRect, view, parent, state);
//                outRect.bottom=100;
//                outRect.left=100;
//            }
//        });
        //动画
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        //线性布局方式的RecyclerView
        //1-创建管理器LinearLayoutManager
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        //2-设置对齐方式
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        //3-将管理器设置到recyclerView
        recyclerView.setLayoutManager(linearLayoutManager);
        //4-创建适配器
        recyclerView1Adapter = new RecyclerView1Adapter(this,list);
        recyclerView.setAdapter(recyclerView1Adapter);    
    }
}

代码注释得很清楚了,。就不多说了,。

接下来写适配器的布局,我们需要自定义一个头布局和底部布局,头部布局和底部布局的用法相同,。头部布局和底部布局很简单就不贴了,。我们直接写正文布局:就一个TextView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="@drawable/recycler_background"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="60dp"
        android:text="recyclerview1"
        android:textColor="#000000" />
</LinearLayout>

现在写适配器的实现:

public class RecyclerView1Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    private Context mContext;
    private List<String> list;
    public boolean isLoadComplet=true;//true默认是加载完成,可以执行加载
    public RecyclerView1Adapter(Context mContext, List<String> list){
        this.mContext = mContext;
        this.list = list;
    }
    /**
     * Item的ViewHolder
     */
    class ItemHolder extends RecyclerView.ViewHolder{
            TextView name;
            public ItemHolder(View view){
                super(view);
                name =view.findViewById(R.id.name);
            }
    }

    /**
     * 头部的ViewHolder
     */
    class HeaderHolder extends RecyclerView.ViewHolder{

        public HeaderHolder(View view){
            super(view);
        }
    }
    /**
     * 尾部的ViewHolder
     */
    class FootHolder extends RecyclerView.ViewHolder{
        public FootHolder(View view){
            super(view);
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = null;
        if(viewType==0){
            view =LayoutInflater.from(mContext).inflate(R.layout.header_recycler,parent,false);
            HeaderHolder headerHolder = new HeaderHolder(view);
            return headerHolder;
        }else if(viewType==1){
            view =LayoutInflater.from(mContext).inflate(R.layout.footer_recycler,parent,false);
            FootHolder footHolder = new FootHolder(view);
            return footHolder;
        }else{
            view = LayoutInflater.from(mContext).inflate(R.layout.adapter_recyclerview1,parent,false);
            ItemHolder itemHolder = new ItemHolder(view);
            return itemHolder;
        }

    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        if(holder instanceof HeaderHolder){

        }else if(holder instanceof  FootHolder){

        }else{
            ItemHolder itemHolder = (ItemHolder)holder;
            itemHolder.name.setText(list.get(position));
            itemHolder.name.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    list.remove(position);
                    notifyDataSetChanged();
                   View  view =LayoutInflater.from(mContext).inflate(R.layout.header_recycler,null);
                    final PopupWindow popupWindow = new PopupWindow(view,ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
                    popupWindow.setFocusable(true);//把当前的所有事件都由popWindow处理
                    popupWindow.showAsDropDown(v,400,0);
                    Button button = view.findViewById(R.id.header_recycler_delete);
                    button.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            list.remove(position);
                            notifyDataSetChanged();
                            popupWindow.dismiss();
                        }
                    });
                    return false;
                }
            });
        }
    }

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

    public String getText(){
        String text = "11111";
        StringBuffer textSum=new StringBuffer();
        Random random = new Random();
        int i = random.nextInt(10)+1;
        for(int j=0;j<i;j++){
            textSum.append(text);
        }
        return textSum.toString();
    }

    @Override
    public int getItemViewType(int position) {
        if(position==0){
            return 0;//头部
        }else if(position+1==getItemCount()){
            return 1;//尾部
        }else{
            return 2;//正常正文内容
        }
    }
}
就这些了,希望能帮助得到你,。一起进步,一起成长,。有不足的地方,请您指出,我会改进的,。奋斗奋斗

源码下载地址:https://download.youkuaiyun.com/download/weixin_42267745/10451079



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值