IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【Android】同时实现上拉刷新和下拉加载 | 基于SwipeRefreshLayout 和 ListView -> 正文阅读

[移动开发]【Android】同时实现上拉刷新和下拉加载 | 基于SwipeRefreshLayout 和 ListView

实现效果


下拉刷新
在这里插入图片描述
上拉加载
在这里插入图片描述

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 用于显示上拉加载时,出现的画面提示,到时候会添加到列表框的底部

<?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"
    >

    <TextView
        android:id="@+id/foot_view_tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="加载更多..."
         />
</LinearLayout>

ftoo_view.xml 布局的效果图:
在这里插入图片描述

2.2 activity_main

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        android:id="@+id/refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
         />

    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</LinearLayout>

3.代码实现


3.1 全局变量

public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener, AbsListView.OnScrollListener{
    ArrayList<String> list_all;             // 存储列表所有的测试数据
    ArrayList<String> list_lv;              // 存储列表当前的数据
    ArrayAdapter<String> 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<String> list_all;             // 存储列表所有的测试数据
    ArrayList<String> list_lv;              // 存储列表当前的数据
    ArrayAdapter<String> 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) { }
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:27:21  更:2021-11-22 12:27:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:59:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码