Android ViewModel使用OnViewCreated执行weired操作
见: 所以,我使用的是viewmodel和livedata,正如您在上面看到的,如果Android ViewModel使用OnViewCreated执行weired操作,android,kotlin,viewmodel,Android,Kotlin,Viewmodel,见: 所以,我使用的是viewmodel和livedata,正如您在上面看到的,如果isShimmerCalled==false那么我将打印日志“称为Shimmer”,然后我的Shimmer布局将显示在UI中。好的 var isShimmerCalled: Boolean = false override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view,
isShimmerCalled==false
那么我将打印日志“称为Shimmer”,然后我的Shimmer布局将显示在UI中。好的
var isShimmerCalled: Boolean = false
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
_binding = FragmentProductBinding.bind(view)
setupRecyclerView()
if (!isShimmerCalled) {
Log.d("Main", "Called shimmer")
startShimmerLayout()
isShimmerCalled = true
}
setUpView()
getProductData()
}
现在我切换到下一个片段(使用导航组件,我有一个包含多个片段的单个活动),然后按下后退按钮
D: setupRecyclerView
D: Called shimmer
因此,请注意,由于该标志,仅打印了setupRecyclerView
。没错
那么我的问题是为什么在UI中显示微光布局?
编辑:
完整代码:
我应该这样做吗(这不是我的代码,其他人的项目片段,因为在那个人的代码中,这个问题不会发生):
**编辑:**天哪!!尽管我评论了startShimmerLayout(),但仍显示出微光
XML:
onCreateView()是视图创建期间活动和运行的onCreate()的片段等价物。
onViewCreated()在创建视图后运行
我应该使用其中一个来提高性能吗否。没有证据表明性能有所提升
实际上,片段中也有一个onCreate()方法,但很少使用(我从未使用过它,也没有找到一个好的用例)
我总是在片段中使用onCreateView()
尝试将此代码放置在创建视图的中而不是我从未使用过
ShimmerLayout
,但我想当您将项目添加到RV时,您也必须停止动画。你在这么做吗?我不知情的猜测,你的片段视图被Android缓存了,所以它被还原了。而不是!isShimmercalled
在片段中,这属于ViewModel,它可以与存储库/用例/交互者/YouNameIt进行对话,后者将知道/存储是否调用了“shimmer”,并将适当的“状态”推送到片段中(显然将从VModel中观察到所述状态)。片段没有进行检查/决策,片段从其ViewModel中观察所述决策(以及要做的事情)。@ADM我正在阻止它getProductData(),这不是问题。片段多次调用ViewCreated是完全正常的,只要确保您清除了与onDestroyView
@MartinMarconcini中视图相关的任何状态就行了。正确,我再次回来时已经确认了,我得到的是相同的视图模型对象,但我如何解决我的问题呢?我不想再次调用shimmer layout/api,因为我是通过按back按钮从另一个片段返回的片段视图生命周期并不等于片段生命周期本身。片段可能会经历分离,这将破坏其视图(片段进入STOPPED
状态),并在重新连接时重新创建视图,而不会完全破坏。您试图解释什么,因为生命周期只有5个枚举状态,而STOPPED不在其中。请明确你的想法@Akash,我知道所有这些,亲爱的解决方案在哪里?@Pawel我想要的是解决方案,而不是生命周期理论,请!解决方案是将其放置在onCreateView中,因为每次片段进入前台时,它都会被调用,并且recyclerview会设置其属性。在这种情况下,haapens使用默认属性创建视图,一旦创建视图,您就可以设置或取消设置微光视图
D: setupRecyclerView
viewModel.breakingNews.observe(viewLifecycleOwner, Observer { response ->
when(response) {
is Resource.Success -> {
hideProgressBar()
response.data?.let { newsResponse ->
newsAdapter.differ.submitList(newsResponse.articles)
}
}
is Resource.Error -> {
hideProgressBar()
response.message?.let { message ->
Log.e(TAG, "An error occured: $message")
}
}
is Resource.Loading -> {
showProgressBar()
}
}
})
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/parentlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.products.ProductFragment">
<com.facebook.shimmer.ShimmerFrameLayout
android:id="@+id/shimmer_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical">
<!-- Adding 3 rows of placeholders -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include layout="@layout/placeholder_layout" />
<include layout="@layout/placeholder_layout" />
<include layout="@layout/placeholder_layout" />
<include layout="@layout/placeholder_layout" />
<include layout="@layout/placeholder_layout" />
<include layout="@layout/placeholder_layout" />
<include layout="@layout/placeholder_layout" />
<include layout="@layout/placeholder_layout" />
<include layout="@layout/placeholder_layout" />
<include layout="@layout/placeholder_layout" />
</LinearLayout>
</com.facebook.shimmer.ShimmerFrameLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<TextView
android:id="@+id/text_view_error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/button_retry"
android:layout_centerHorizontal="true"
android:text="Results could not be loaded"
android:visibility="gone"
tools:visibility="visible" />
<Button
android:id="@+id/button_retry"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Retry"
android:visibility="gone"
tools:visibility="visible" />
</RelativeLayout>