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()
    }
}

猜你喜欢

转载自blog.csdn.net/yu540135101/article/details/120018594