在ViewPager中,我有3个片段。第一个包含代表每日日历的另一个片段(CalendarFragment)。在该片段的onCreateView中,观察者在ViewModel中指向MutableLiveData变量,并在每次数据更改时调用一种方法来绘制一些视图(事件)并将其添加到该片段的RelativeLayout中。
事件抽奖存在一些问题:
-首次创建片段时,触发了两次观察者,因此绘制了视图并添加了两次
-在父片段中,有一个按钮可以启动“结果活动”,每次我从该活动回来时,都会调用draw方法,并在其他视图上添加新视图
-滑动到第三个片段并回到第一个片段之后,所有绘制的视图都消失了
That's the problem caused by the redraw of the same views
class CalendarFragment: Fragment() {
private lateinit var rlCalendarRoot: RelativeLayout
private var events = ArrayList<Event>()
private val mFragmentsViewModel: FragmentsViewModel
get() = ViewModelProviders.of(this).get(FragmentsViewModel::class.java)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_calendar, container, false)
rlCalendarRoot = view.findViewById<View>(R.id.rl_calendar_root) as RelativeLayout
mFragmentsViewModel.eventsList.observe(this, Observer {
it?.let {
events.clear()
events.addAll(it)
//this method draw new views depending on events data and simply add them to rlCalendarRoot
drawEvents(events)
}
})
}
return view
}
片段的布局
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="85"
android:orientation="vertical">
<TextView
android:id="@+id/lbnl_09"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="@string/nine_am"
android:textSize="16sp"/>
...others text views to display hours...
</LinearLayout>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@color/divider_color"/>
<RelativeLayout
android:id="@+id/rl_calendar_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="20"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="@dimen/hour_divider_height"
android:layout_marginTop="20dp"
android:background="@color/divider_color"/>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/hour_divider_height"
android:layout_marginTop="@dimen/hour_divider_margin_top"
android:background="@color/divider_color"/>
... a lot of others equals views
</LinearLayout>
</RelativeLayout>
主要活动基本上是带有框架布局的抽屉布局,在选择项目时我会替换片段。当我更改“屏幕”并回到包含带有日历片段的主屏幕时,将以正确的方式生成事件视图。我认为刷新布局,整个视图或用相同类型的新片段替换片段可以解决问题,但似乎没有任何效果。
我尝试过:
-rlCalendarRoot上的invalidate(),postInvalidate()和setWillNotDraw(false)(什么都没有发生)
-添加一个VISIBLE ProgressBar并设置可视性。在布局上设置GONE,然后在观察者事件中为.ProgressBar设置.GONE,为布局设置.VISIBILE并调用draw方法(但是它需要rlCalendarRoot宽度来绘制视图,并且通过这种方式获取正确的宽度时出现错误)
-设置观察者事件发生时(布局未显示)事件视图上的可见性。
-添加片段事务以用其自身替换片段
-分离片段并附加相同片段的新实例
-removeAllViews(),但它也删除了分隔符
我只需要在干净的rlCalendarRoot上绘制事件,但找不到解决方法