台达PLC解密次数限制

    科技2026-04-26  78

    台达PLC解密次数限制【专业】【信誉】【18230062509】这一块本来想写下首页来着,但是想了想东西太多了,所以挑选了一个不需要联网的一个页面——浏览历史,这一个页面既继承了 BaseActivity,又有无内容、加载中、有内容等状态的切换,所以比较合适。 先来看一下页面的布局吧:

    <?xml version="1.0" encoding="utf-8"?>

    <com.zj.core.util.TitleBar android:layout_width="match_parent" android:layout_height="wrap_content" app:backImageVisiable="true" app:titleName="浏览历史" /> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.scwang.smartrefresh.layout.SmartRefreshLayout android:id="@+id/historySmartRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/historyRecycleView" android:layout_width="match_parent" android:layout_height="match_parent" /> </com.scwang.smartrefresh.layout.SmartRefreshLayout> <include layout="@layout/layout_lce" /> </FrameLayout> 复制代码 布局需要注意的是要把 layout_lce 写进去,layout_lce 就是咱们刚才编写的状态的布局,TitleBar 是我自定义的一个头布局,可设置标题、左边按钮、右边按钮,按钮的点击事件、图片或者问题都可以直接进行设置,大家可以进入 Github 中自行下载进行使用。 由于这个页面横竖屏无需做处理,所以只写一个页面即可。 布局写完了,下面就可以开始正式使用 BaseActivity 了: class BrowseHistoryActivity : ArticleCollectBaseActivity() { private lateinit var articleAdapter: ArticleAdapter private var page = 1 override fun getLayoutId(): Int { return R.layout.activity_browse_history } override fun initView() { historyRecycleView.layoutManager = LinearLayoutManager(this) articleAdapter = ArticleAdapter( this, R.layout.adapter_article, // viewModel.articleList, //数据源 false ) articleAdapter.setHasStableIds(true) historyRecycleView.adapter = articleAdapter historySmartRefreshLayout.apply { setOnRefreshListener { reLayout -> reLayout.finishRefresh(measureTimeMillis { page = 1 // getArticleList() //加载数据 }.toInt()) } setOnLoadMoreListener { reLayout -> val time = measureTimeMillis { page++ // getArticleList() //加载数据 }.toInt() reLayout.finishLoadMore(if (time > 1000) time else 1000) } } } override fun initData() { // getArticleList() //加载数据 } companion object { fun actionStart(context: Context) { val intent = Intent(context, BrowseHistoryActivity::class.java) context.startActivity(intent) } }

    } 复制代码 上面的代码就是使用BaseActivity,大家也可以看到,和正常使用 Activity 基本一致,只不过更加简洁了而已,最下面的伴生方法是给了其他类跳转到当前类的一个入口,这里看不出优势,但如果需要传其他参数的话效果就很好了,可以有效避免传错参数。 上面类还有一些内容没写完,剩下的是 MVVM 的内容,在下一个模块说。 第三步——使用MVVM 相信看过我之前两篇文章的老司机们已经会使用了,再来回顾一下吧! VM 之前也说过,不是 ViewModel 但也是,不懂的可以去看下之前的文章。来看下 ViewModel 吧: class BrowseHistoryViewModel(application: Application) : AndroidViewModel(application) {

    private val pageLiveData = MutableLiveData<Int>() val articleList = ArrayList<Article>() val articleLiveData = Transformations.switchMap(pageLiveData) { page -> BrowseHistoryRepository(application).getBrowseHistory(page) } fun getArticleList(page: Int) { pageLiveData.value = page }

    } 复制代码 是不是很简单,ViewModel + LiveData,就是这样,很简单是不是! 这里需要注意下使用到了 AndroidViewModel 。咱们平时使用的都是 ViewModel,有时候为了获取 Context 还需要单独传下参数,而 ViewModel 传参数又很麻烦,还需要使用 Factory 来传递,这种情况就可以使用 AndroidViewModel 了,可以直接继承进行使用,用的时候和之前一样就可以: private val viewModel by lazy { ViewModelProvider(this).get(BrowseHistoryViewModel::class.java) } 复制代码 是不是又 Get 到一个知识点,快记下来! 刚才的代码中在获取数据的地方都注释了,现在来看下吧! private fun getArticleList() { if (viewModel.articleList.size <= 0) { startLoading() } viewModel.getArticleList(page) }

    override fun initData() { viewModel.articleLiveData.observe(this, { if (it.isSuccess) { val articleList = it.getOrNull() if (articleList != null) { loadFinished() if (page == 1 && viewModel.articleList.size > 0) { viewModel.articleList.clear() } viewModel.articleList.addAll(articleList) articleAdapter.notifyDataSetChanged() } else { showLoadErrorView() } } else { if (viewModel.articleList.size <= 0) { showNoContentView("当前无历史浏览记录") } else { showToast("没有更多数据") loadFinished() } } }) getArticleList() }

    复制代码 这段代码信息量就比较大了,老司机们应该看到了刚才 BaseActivity 的方法:startLoading()、loadFinished()、showLoadErrorView()、showNoContentView("")等,其实原理很简单,根据数据的状态进行显示不同的页面即可。 再来看看 BrowseHistoryRepository 的代码吧: class BrowseHistoryRepository(context: Context) {

    private val browseHistoryDao = PlayDatabase.getDatabase(context).browseHistoryDao() /** * 获取历史记录列表 */ fun getBrowseHistory(page: Int) = fire { val projectClassifyLists = browseHistoryDao.getHistoryArticleList((page - 1) * 20,HISTORY) if (projectClassifyLists.isNotEmpty()) { Result.success(projectClassifyLists) } else { Result.failure(RuntimeException("response status is ")) } }

    } 复制代码 到这里就很清晰了,Activity 用来展示页面,Repository 用来获取数据,ViewModel 用来处理数据和暂时保存数据以供 Activity 使用。 数据库肯定使用的是 Room ,这里要提一下,没用过 Room 的一定要使用下,如果你使用的是 Kotlin 的话更要使用了,Room 搭配上协程后简直不要太香!像上面的代码一样一行代码直接出结果,也无需进行线程的切换,因为这本来就是协程的擅长之处嘛! 总结 本来想写的东西很多,但是下笔却不知道如何进行描述,也怪自己,之前每个月能写几篇文章锻炼一下,现在一个月也就写一篇左右,是自己太懒了,忙不是借口,就是懒。。。 这一篇文章只是一个概览,是这个系列的第一篇文章,告诉大家一些看着神秘的东西到底是啥,该怎样使用,下一篇文章带大家看一看项目的首页是怎样一步一步搭建起来的。

    Processed: 0.011, SQL: 9