Android kotlin 用RecyclerView(androidx+BRVAH3.0.6)实现下拉刷新和上拉加载更多(offset+limit)功能

一、实现效果

二、引入依赖

1、在appbuild.gradle在添加以下代码
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6',这个里面带的上拉更多数据,直接调用就即可

BaseRecyclerViewAdapterHelper简称BRVAH

Android SDK是否支持BaseRecyclerViewAdapterHelper:3.0.6
android compileSdkVersion 29
android compileSdkVersion 30
android compileSdkVersion 31
android compileSdkVersion 32
android compileSdkVersion 33

这依赖包还需要得到要添加,在Projectbuild.gradle在添加以下代码,不添加就不行

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }//加上
    }
}

2、implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'下拉刷新

三、实现源码

1、实体类

我用的是greenDAOAndroid kotlin 进阶之如何用greenDAO实现增删改查数据(拷贝assets下的db文件到data/data/applicationId/databases目录),你自己按下这个改,我改的源码没完整,网络请求(offset+limit)也可以,先看一下DisBase.java

package com.example.myapplication3.data;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Property;
import org.greenrobot.greendao.annotation.Generated;

@Entity(nameInDb = "DisBase",createInDb = false,generateConstructors = false)
public class DisBase {
    @Id
    @Property(nameInDb = "id")
    private String id;
    @Property(nameInDb = "code")
    private String code;
    @Property(nameInDb = "name")
    private String name;
    @Property(nameInDb = "age")
    private String age;
    public DisBase() {
    }
    public String getId() {
        return this.id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getCode() {
        return this.code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return this.age;
    }
    public void setAge(String age) {
        this.age = age;
    }
}

2、适配器

BaseRecyclerViewAdapterHelper:3.0.6来修改RVAdapter.kt

package com.example.myapplication3.adapter

import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.module.LoadMoreModule
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.example.myapplication3.R
import kotlinx.android.synthetic.main.item.view.*

class RVAdapter(layoutResId: Int = R.layout.item) :
    BaseQuickAdapter<MutableMap<String, String>, BaseViewHolder>(layoutResId), LoadMoreModule {

    override fun convert(holder: BaseViewHolder, item: MutableMap<String, String>) {
        holder.itemView.run {
            tv_code.text = "人号:"+item["Code"]
            tv_name.text = "姓名:"+ item["Name"]
            tv_age.text = "年龄:" + item["Age"]
        }
    }
}

item布局item.xml

<?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="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_code"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:ellipsize="end"
        android:lineSpacingExtra="6dp"
        android:maxLines="2"
        android:text="小demo.looklook" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:ellipsize="end"
        android:lineSpacingExtra="6dp"
        android:maxLines="2"
        android:text="哈哈哈" />

    <TextView
        android:id="@+id/tv_age"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:ellipsize="end"
        android:lineSpacingExtra="6dp"
        android:maxLines="2"
        android:text="哈哈哈" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginTop="15dp"
        android:background="#D1D2D4" />
</LinearLayout>

3、实现视图

MainActivity.kt,容易理解

package com.example.myapplication3

import android.os.Bundle
import android.os.Handler
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.example.myapplication3.adapter.RVAdapter
import com.example.myapplication3.factory.DaoFactory
import com.example.myapplication3.file.File.copyDbFileFromAsset
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener {

    private val mAdapter by lazy {
        RVAdapter().apply {
//            setOnItemClickListener(this@MainActivity)
        }
    }

    //起始位
    var offset: Int = 0

    //每页加载数
    var limit: Int = 20

    var mLinearLayoutManager: LinearLayoutManager? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initView()
        initFile()
        initData()
    }

    private fun initView() {
        mLinearLayoutManager = LinearLayoutManager(this)
        recyclerview.layoutManager = mLinearLayoutManager
        recyclerview.adapter = mAdapter
        setLoadMoreAdapter(mAdapter)

        swipeRefreshLayout.setOnRefreshListener {
            Handler().postDelayed({
                offset = 0
                limit = 20
                swipeRefreshLayout.isRefreshing = false
                initData()
            }, 1000)
        }
    }

    private fun initFile() {
        copyDbFileFromAsset()
    }

    private fun initData() {

        val dao = DaoFactory.instant.getDisBaseDao()
        val query = dao.queryBuilder()
            .offset(offset)
            .limit(limit)
            .build()
        val datas = query.list()

        val mList = arrayListOf<MutableMap<String, String>>()
        for (myDatas in datas) {
            val map = mutableMapOf<String, String>()
            map["Code"] = myDatas.code ?: ""
            map["Name"] = myDatas.name ?: ""
            map["Age"] = myDatas.age ?: ""
            mList.add(map)
        }
        loadMoreResult(mList, mAdapter)
    }

    //加载更多适配
    private fun <T> setLoadMoreAdapter(mAdapter: BaseQuickAdapter<T, BaseViewHolder>) {
//        //设置加载更多
        mAdapter.loadMoreModule.setOnLoadMoreListener {
            Handler().postDelayed({
                offset += limit
                initData()
            }, 500)
        }

        //设置是否自动加载更多
        mAdapter.loadMoreModule.isAutoLoadMore = true
//        //当自动加载开启,同时数据不满一屏时,是否继续执行自动加载更多(默认为true)
        mAdapter.loadMoreModule.isEnableLoadMoreIfNotFullPage = false
    }


    private fun <T> loadMoreResult(data: List<T>, mAdapter: BaseQuickAdapter<T, BaseViewHolder>) {
        if (data.isEmpty() && offset == 0) {

        } else {
            if (offset == 0) {
                //下拉刷新使用
                mAdapter.setList(data)
            } else {
                //上拉加载更多使用
                mAdapter.addData(data)
            }
            if (data.size < limit) {
                //如果s少于20,显示没有更多数据布局
                val isLoadEndMoreGone = (offset == 0)
                mAdapter.loadMoreModule.loadMoreEnd(isLoadEndMoreGone)
            } else {
                mAdapter.loadMoreModule.loadMoreComplete()
            }
        }
    }
	//下拉刷新
    override fun onRefresh() {
//        Handler().postDelayed({
        offset = 0
        limit = 20
        swipeRefreshLayout.isRefreshing = false
        initData()
//        }, 1000)
    }

    private fun copyDbFileFromAsset() {
        val map = mutableMapOf<String, Boolean>()
        map["teststaff.db"] = true
        copyDbFileFromAsset(this, map)
    }
}

activity_main.xml

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


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

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            tools:listitem="@layout/item" />

    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</LinearLayout>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下拉刷新上拉加载更多是移动应用中非常常见的功能,而使用 Compose 实现这些功能非常简单。下面是一个简单的示例,演示如何在 Compose 中实现下拉刷新上拉加载更多: ```kotlin @Composable fun MyScreen() { var refreshing by remember { mutableStateOf(false) } var loadingMore by remember { mutableStateOf(false) } val items = remember { mutableStateListOf("Item 1", "Item 2", "Item 3") } SwipeRefresh( state = rememberSwipeRefreshState(refreshing), onRefresh = { refreshing = true // 在这里执行下拉刷新逻辑 refreshing = false } ) { LazyColumn( contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { items(items) if (loadingMore) { item { // 在这里显示“正在加载更多”的视图 } } if (!loadingMore) { item { // 在这里显示“加载更多”按钮 Button( onClick = { loadingMore = true // 在这里执行加载更多逻辑 loadingMore = false }, modifier = Modifier.fillMaxWidth() ) { Text("加载更多") } } } } } } ``` 在这个示例中,我们使用 `SwipeRefresh` 组合来实现下拉刷新功能,并使用 `LazyColumn` 组合来实现滚动列表。当用户下列表时,会触发 `onRefresh` 回调,并将 `refreshing` 状态设置为 `true`,表示正在刷新。在 `onRefresh` 回调中,我们执行下拉刷新逻辑,并将 `refreshing` 状态设置为 `false`,表示刷新结束。 对于上拉加载更多功能,我们使用一个布尔状态 `loadingMore` 来表示是否正在加载更多。在 `LazyColumn` 中,我们在列表底部显示一个“加载更多”按钮,当用户点击按钮时,我们将 `loadingMore` 状态设置为 `true`,表示正在加载更多。在加载更多逻辑完成后,我们将 `loadingMore` 状态设置为 `false`,表示加载更多结束,并更新列表数据。 这只是一个简单的示例,你可以按照自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬sir哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值