Android MVVM+RecyclerView+SwipeRefreshLayout实现下拉刷新和上滑加载更多

请添加图片描述

引入

    //ViewModel的创建
    implementation 'androidx.activity:activity-ktx:1.1.0'//by viewModels
    implementation 'androidx.fragment:fragment-ktx:1.2.5'//by viewModels

    //
    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"//下拉刷新

    //https://github.com/CymChad/BaseRecyclerViewAdapterHelper
    implementation "com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4"//适配器的封装

View

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private val viewModel by viewModels<MainViewModel> { MainViewModelFactory() }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        initView()
        initData()
    }

    private fun initData() {
        //获取初始数据
        viewModel.getInitData()
        //初始化适配器
        val myAdapter2 = MyAdapter2(R.layout.recycler_main)
        //上滑动加载更多
        myAdapter2.loadMoreModule.setOnLoadMoreListener {
            Log.d(TAG, "initData: load more data")
            binding.rlRefresh.postDelayed({
                //获取更多数据
                viewModel.getMoreData()
                //停止加载更多动画
                myAdapter2.loadMoreModule.loadMoreComplete()
            }, 1000)
        }
        //data发生变化的监听
        viewModel.dataList.observe(this, Observer {
            Log.d(TAG, "initData: 数据发生改变")
            if (!viewModel.isLoadMore) {
                myAdapter2.data = it
                binding.rvRecycle.adapter = myAdapter2
                binding.rvRecycle.layoutManager =
                    LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
            } else {
                myAdapter2.addData(it)
            }
        })
    }

    private fun initView() {
        //设置颜色
        //binding.rlRefresh.setColorSchemeColors(Color.RED)
        //下拉刷新初始数据
        binding.rlRefresh.setOnRefreshListener {
            Log.d(TAG, "initView: refresh data ")
            binding.rlRefresh.postDelayed({
                //获取初始化数据
                viewModel.getInitData()
                //停止动画
                binding.rlRefresh.isRefreshing = false
            }, 1000)
        }
    }

}

ViewModel

class MainViewModel(private var repository: MainRepository) : ViewModel() {

    var isLoadMore = false
    var dataList = MutableLiveData<MutableList<String>>()
    private var pageId = 0

    fun getInitData() {
        isLoadMore = false
        pageId = 0
        dataList.value = repository.getData(page = pageId)
    }

    fun getMoreData() {
        isLoadMore = true
        dataList.value = repository.getData(page = ++pageId)
    }

}

@Suppress("UNCHECKED_CAST")
class MainViewModelFactory : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return MainViewModel(MainRepositoryProvider.getInstance()) as T
    }
}

Model

interface MainRepository {
    fun getData(page: Int): MutableList<String>
}

class MainRepositoryImp : MainRepository {
    override fun getData(page: Int): MutableList<String> {
        val list = mutableListOf<String>()
        for (i in 0..9) {
            list.add((i + page * 10).toString())
        }
        return list
    }
}

object MainRepositoryProvider {
    fun getInstance(): MainRepository {
        return MainRepositoryImp()
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值