刷新RelativeLayout以便删除以编程方式添加的所有视图

时间:2019-07-12 13:01:37

标签: android android-fragments kotlin

在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>

主要活动基本上是带有框架布局的抽屉布局,在选择项目时我会替换片段。当我更改“屏幕”并回到包含带有日历片段的主屏幕时,将以正确的方式生成事件视图。我认为刷新布局,整个视图或用相同类型的新片段替换片段可以解决问题,但似乎没有任何效果。
我尝试过:
-rlCa​​lendarRoot上的invalidate(),postInvalidate()和setWillNotDraw(false)(什么都没有发生)

-添加一个VISIBLE ProgressBar并设置可视性。在布局上设置GONE,然后在观察者事件中为.ProgressBar设置.GONE,为布局设置.VISIBILE并调用draw方法(但是它需要rlCalendarRoot宽度来绘制视图,并且通过这种方式获取正确的宽度时出现错误)

-设置观察者事件发生时(布局未显示)事件视图上的可见性。

-添加片段事务以用其自身替换片段

-分离片段并附加相同片段的新实例

-removeAllViews(),但它也删除了分隔符

我只需要在干净的rlCalendarRoot上绘制事件,但找不到解决方法

0 个答案:

没有答案