一、实现效果
二、引入依赖
1、在app
的build.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 | 是 |
这依赖包还需要得到要添加,在Project
的build.gradle
在添加以下代码,不添加就不行
allprojects {
repositories {
...
maven { url "https://jitpack.io" }//加上
}
}
2、implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
:下拉刷新
三、实现源码
1、实体类
我用的是greenDAO
:Android 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>