Kotlin在Adapter中使用ViewModel

Activity通常有一个ViewModel,在使用RecyclerView的时候要写一个Adapter,在Adapter里也要处理一些数据。但是(好像)在Adapter类中没有直接获取ViewModel的办法,所以这里提供一个参考。

首先看到ViewModelProvider的参数类型是一个ViewModelStoreOwner,如果是在Activity中,我们直接传入this就可以了。但是在Adapter中this并不是一个Activity,所以类型不匹配。

首先在Adapter类中添加一个静态变量:

companion object {
    // 获取viewModel需要用到这个,必须先在MainActivity的onCreate方法中传过来
    var viewModelStoreOwner: AppIconSettingActivity? = null
}

然后在MainActivity的onCreate方法中添加

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.your_activity)
    // 将this传递给Adapter,用于获取viewModel,必须写在adapter创建之前
    AppIconAdapter.viewModelStoreOwner = this
    // ...
    // 创建Adapter
}

最后在Adapter类的onCreateViewHolder方法中获取viewModel:

private lateinit var viewModel: SettingViewModel

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val view = LayoutInflater.from(parent.context)
        .inflate(R.layout.your_layout, parent, false)
    val viewHolder = ViewHolder(view)
    // 获取viewModel
    viewModel = ViewModelProvider(viewModelStoreOwner!!).get(YourViewModel::class.java)
    return viewHolder
}

这样就可以使用viewModel了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,需要在项目的build.gradle文件添加SmartRefreshLayout的依赖: ```groovy dependencies { // ... 其他依赖 implementation 'com.scwang.smart:refresh-layout-kernel:2.0.3' implementation 'com.scwang.smart:refresh-header-classics:2.0.3' } ``` 接着,在布局文件添加SmartRefreshLayout和RecyclerView: ```xml <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <com.scwang.smartrefresh.layout.SmartRefreshLayout android:id="@+id/refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> </com.scwang.smartrefresh.layout.SmartRefreshLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout> ``` 然后,在Activity或Fragment,初始化刷新布局和RecyclerView,并设置下拉刷新和上拉加载的回调: ```kotlin class MainActivity : AppCompatActivity() { private lateinit var refreshLayout: SmartRefreshLayout private lateinit var recyclerView: RecyclerView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) refreshLayout = findViewById(R.id.refreshLayout) recyclerView = findViewById(R.id.recyclerView) // 初始化RecyclerView的Adapter和LayoutManager // 设置下拉刷新和上拉加载的回调 refreshLayout.setOnRefreshListener { // 执行下拉刷新操作 } refreshLayout.setOnLoadMoreListener { // 执行上拉加载操作 } } } ``` 当需要完成下拉刷新或上拉加载时,只需在相应的回调函数执行相应的操作即可。例如,在下拉刷新回调,可以请求服务器获取最新数据,并更新RecyclerView的Adapter数据源,然后结束刷新: ```kotlin refreshLayout.setOnRefreshListener { // 执行下拉刷新操作 viewModel.refreshData() // 请求服务器获取最新数据 adapter.notifyDataSetChanged() // 更新Adapter数据源 refreshLayout.finishRefresh() // 结束下拉刷新 } ``` 在上拉加载回调,可以请求服务器获取更多数据,并添加到RecyclerView的Adapter数据源末尾,然后结束加载: ```kotlin refreshLayout.setOnLoadMoreListener { // 执行上拉加载操作 viewModel.loadMoreData() // 请求服务器获取更多数据 adapter.notifyDataSetChanged() // 更新Adapter数据源 refreshLayout.finishLoadMore() // 结束上拉加载 } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值