栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Android】同时实现上拉刷新和下拉加载 | 基于SwipeRefreshLayout 和 ListView

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Android】同时实现上拉刷新和下拉加载 | 基于SwipeRefreshLayout 和 ListView

文章目录
  • 实现效果
  • 1. 准备环境
  • 2. 布局
    • 2.1 foot_view
    • 2.2 activity_main
  • 3.代码实现
    • 3.1 全局变量
    • 3.2 OnCreate
    • 3.3 自定义的showInfo方法
    • 3.4 下拉刷新
    • 3.5 上拉加载
  • 4. 所有代码

实现效果

下拉刷新

上拉加载

1. 准备环境

Android Studio 2020.3.1

(1) 给项目安装 androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-beta01布局组件

(2) 在 dependencies依赖中添加一行

implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-beta01'

(3) 点击 Sync 同步,完成安装
笔者使用的是1.1.0 beta01版本,只要保证在这个版本之上应该都适用,更多关于这个布局的使用,请参考官方API Android开发文档,

2. 布局
2.1 foot_view

foot_view 用于显示上拉加载时,出现的画面提示,到时候会添加到列表框的底部




    

ftoo_view.xml 布局的效果图:

2.2 activity_main

activity_main.xml 应用主要的布局 ,在 SwipeRefreshLayout布局里嵌套了一个 ListView




    
    

    

3.代码实现
3.1 全局变量
public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener, AbsListView.OnScrollListener{
    ArrayList list_all;             // 存储列表所有的测试数据
    ArrayList list_lv;              // 存储列表当前的数据
    ArrayAdapter adapter;           // ListView的适配器对象
    SwipeRefreshLayout refreshLayout;       // 主界面刷新布局的对象
    ListView lv;                            // 主界面列表对象
    View foot;                              // 上拉加载底部的视图
    final int MAX_PAGE = 5;                 // 最多的页数
    final int PER_PAGE = 15;                // 每页的数据个数
    int page = 0;                           // 当前页数
}
3.2 onCreate
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 1. 获取组件
        lv = findViewById(R.id.listview);
        refreshLayout = findViewById(R.id.refresh);

        // 2. 产生列表框测试的数据
        list_all = new ArrayList<>();
        for (int i = 0; i < PER_PAGE * MAX_PAGE; i++)
            list_all.add(String.format("Botton:%d", i));
        list_lv = new ArrayList<>(list_all.subList(0, PER_PAGE));

        // 3. 设置 适配器 以及 视图
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list_lv);
        foot = LayoutInflater.from(this).inflate(R.layout.foot_view,null);
        lv.setAdapter(adapter);

        // 4. 设置监听事件
        lv.setOnScrollListener(this);               // 下拉刷新
        refreshLayout.setOnRefreshListener(this);   // 上拉加载
    }
3.3 自定义的showInfo方法
  public void showPageInfo(){
        Toast.makeText(MainActivity.this, String.format("当前是第%d页",page), Toast.LENGTH_SHORT).show();
    }
3.4 下拉刷新
    // SwipeRefreshLayout 下拉刷新
    @Override
    public void onRefresh() {
        page = ((page == MAX_PAGE - 1) ? 0 :  page + 1);
        list_lv.clear();
        list_lv.addAll(list_all.subList(page * PER_PAGE, (page+1) * PER_PAGE - 1));
        System.out.println(list_lv.toString());
        adapter.notifyDataSetChanged();
        showPageInfo();
        refreshLayout.setRefreshing(false);
    }
3.5 上拉加载
    // ListView 上拉加载
    @Override
    public void onScrollStateChanged(AbsListView absListView, int i) {
        int last =lv.getLastVisiblePosition();
        int first = lv.getFirstVisiblePosition();
        int num = lv.getCount();

        // SCROLL_STATE_IDLE 表示 当前View没有滚动

        if(last == num - 1 && SCROLL_STATE_IDLE == i)
            lv.addFooterView(foot);
        if(num == PER_PAGE + 1){
            lv.removeFooterView(foot);
            onRefresh();
            lv.setSelection(0);
        }
    }
    // ListView 上拉加载接口的另一个方法 没有用到 可以不管
    @Override
    public void onScroll(AbsListView absListView, int i, int i1, int i2) { }
4. 所有代码
package com.example.test1;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.Adapter;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener, AbsListView.OnScrollListener{
    ArrayList list_all;             // 存储列表所有的测试数据
    ArrayList list_lv;              // 存储列表当前的数据
    ArrayAdapter adapter;           // ListView的适配器对象
    SwipeRefreshLayout refreshLayout;       // 主界面刷新布局的对象
    ListView lv;                            // 主界面列表对象
    View foot;                              // 上拉加载底部的视图
    final int MAX_PAGE = 5;                 // 最多的页数
    final int PER_PAGE = 15;                // 每页的数据个数
    int page = 0;                           // 当前页数

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

        // 1. 获取组件
        lv = findViewById(R.id.listview);
        refreshLayout = findViewById(R.id.refresh);

        // 2. 产生列表框测试的数据
        list_all = new ArrayList<>();
        for (int i = 0; i < PER_PAGE * MAX_PAGE; i++)
            list_all.add(String.format("Botton:%d", i));
        list_lv = new ArrayList<>(list_all.subList(0, PER_PAGE));

        // 3. 设置 适配器 以及 视图
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list_lv);
        foot = LayoutInflater.from(this).inflate(R.layout.foot_view,null);
        lv.setAdapter(adapter);

        // 4. 设置监听事件
        lv.setOnScrollListener(this);               // 下拉刷新
        refreshLayout.setOnRefreshListener(this);   // 上拉加载
    }
    public void showPageInfo(){
        Toast.makeText(MainActivity.this, String.format("当前是第%d页",page), Toast.LENGTH_SHORT).show();
    }
    // SwipeRefreshLayout 下拉刷新
    @Override
    public void onRefresh() {
        page = ((page == MAX_PAGE - 1) ? 0 :  page + 1);
        list_lv.clear();
        list_lv.addAll(list_all.subList(page * PER_PAGE, (page+1) * PER_PAGE - 1));
        System.out.println(list_lv.toString());
        adapter.notifyDataSetChanged();
        showPageInfo();
        refreshLayout.setRefreshing(false);
    }

    // ListView 上拉加载
    @Override
    public void onScrollStateChanged(AbsListView absListView, int i) {
        int last =lv.getLastVisiblePosition();
        int first = lv.getFirstVisiblePosition();
        int num = lv.getCount();

        // SCROLL_STATE_IDLE 表示 当前View没有滚动

        if(last == num - 1 && SCROLL_STATE_IDLE == i)
            lv.addFooterView(foot);
        if(num == PER_PAGE + 1){
            lv.removeFooterView(foot);
            onRefresh();
            lv.setSelection(0);
        }
    }
    // ListView 上拉加载接口的另一个方法 没有用到 可以不管
    @Override
    public void onScroll(AbsListView absListView, int i, int i1, int i2) { }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/583951.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号