不可见布局在 Android 中可见时不可见

Invisible Layout not visible when make it visible in Android

我正在尝试实现一些功能,例如在 RecyclerView (id=schedule_recycler_view) 中查看项目列表,父布局是 CardView (id = info_card_view)。该项目是通过 API 调用获取的。如果没有找到项目,或者连接问题,我想查看另一个布局(id = no_list_layout),这是第一次可见性消失。

但是我面临的问题是,尽管我以编程方式使该布局 (id = no_list_layout) 的可见性可见,但它并不可见。

有人能帮忙吗?

这是我试过的代码

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

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/top_bar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="@dimen/_90sdp"
        android:orientation="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/guideline">

        <com.google.android.material.textview.MaterialTextView/>

        <com.google.android.material.textview.MaterialTextView/>

        <com.google.android.material.textview.MaterialTextView/>

    </LinearLayout>

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="@dimen/_90sdp" />

    <ImageView
        android:id="@+id/add_schedule_image_view"
        android:layout_width="@dimen/_50sdp"
        android:layout_height="@dimen/_50sdp"
        android:background="@drawable/circle_white_with_blue_border"
        android:padding="@dimen/_5sdp"
        android:src="@drawable/ic_plus"
        app:layout_constraintBottom_toBottomOf="@id/guideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.9"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/guideline" />


    <com.google.android.material.card.MaterialCardView
        android:id="@+id/info_card_view"
        style="@style/CardViewStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="@dimen/_200sdp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/top_bar_layout">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/schedule_recycler_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>


            <LinearLayout
                android:id="@+id/no_list_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="@dimen/_15sdp"
                android:orientation="vertical"
                android:gravity="center"
                android:visibility="gone"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">

                <ImageView
                    android:id="@+id/not_found_image_view"
                    android:layout_width="@dimen/_150sdp"
                    android:layout_height="@dimen/_150sdp"
                    tools:src="@drawable/ic_schedule"/>

                <TextView
                    android:id="@+id/not_found_text_view"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    tools:text="No Invoice"
                 />

            </LinearLayout>

        </androidx.constraintlayout.widget.ConstraintLayout>

    </com.google.android.material.card.MaterialCardView>

</androidx.constraintlayout.widget.ConstraintLayout>

在科特林文件中

    class TutorScheduleFragment : BaseFragment() {



    private val tuitionScheduleAdapter by lazy {
        TutorScheduleAdapter {
            context?.showToast(it.day)
        }
    }

    private val viewModel: TutorScheduleViewModel by lazy {
        getViewModel {
            TutorScheduleViewModel(
                PreferenceService(context?.getSharedPreference()!!)
            )
        }
    }

    override fun getLayoutResId() = R.layout.fragment_tutor_schedule

    override fun onResume() {
        viewModel.getSchedule(jobTutorId!!)
    }

    override fun observeLiveData() {
        viewModel.tuitionScheduleUiState.observe(this@TutorScheduleFragment, Observer {
            it.getContentIfNotHandled()?.let { state ->
                when (state) {

                    is Progress -> {
                        if (state.isLoading) {

                        } else {

                        }
                    }

                    is Success -> {
                        val schedules = state.successInfo.data


                        if (scheduleData.schedules.size == 0) {
                            no_list_layout.visibility = View.VISIBLE
                        } else {                                 

              tuitionScheduleAdapter.notifyChanged(scheduleData.schedules)
                        }

                    }

                    is Alert -> context?.showToast(state.alert)

                    is Failure -> {
                        if (state.throwable is IOException) {
                            context?.showToast("Internet Connection Failed")
                        } else {
                            context?.showToast("Json Parsing Error")
                        }
                    }
                }
            }
        })


    }

}

你应该使用no_list_layout.visibility = View.VISIBLE

更改您的视图可见性代码

试试这个:

科特林:

if (list.size == 0) {
    no_list_layout.visibility= View.VISIBLE
} else {
    adapter.notifyChanged(list)
}

在Java

if (list.size == 0) {
        no_list_layout.setVisibility(View.VISIBLE)
    } else {
        adapter.notifyChanged(list)
    }

你可以试试 runOnUiThread.

runOnUiThread runs the specified action on the UI thread. If the current thread is the UI thread, then the action is executed immediately. If the current thread is not the UI thread, the action is posted to the event queue of the UI thread.

context?.runOnUiThread(Runnable {
    // Your Logic
  if (list.size==0) {
       no_list_layout.visibility= View.VISIBLE
  } else {
       // Your work
  }
})

您还必须隐藏您的 recyclerview 并使其在其他情况下可见,如下所示:

if (scheduleData.schedules.size == 0) {
    schedule_recycler_view.visibility = View.GONE
    no_list_layout.visibility = View.VISIBLE
} else {   
    schedule_recycler_view.visibility = View.VISIBLE
    no_list_layout.visibility = View.GONE                              
    tuitionScheduleAdapter.notifyChanged(scheduleData.schedules)
}

终于找到真凶了。它在布局文件中。我重新创建布局

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

<androidx.constraintlayout.widget.ConstraintLayout 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/info_card_view"
    style="@style/CardViewStyle"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="1.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/top_bar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/rectangle_light_blue_top_info_holder"
        android:minHeight="@dimen/_90sdp"
        android:orientation="vertical"
        android:paddingTop="@dimen/_10sdp"
        android:paddingBottom="@dimen/_10sdp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <com.google.android.material.textview.MaterialTextView
            android:id="@+id/upcoming_action_text_view"
            style="@style/TextViewStyle.Bold"
            android:text="Upcoming Test"
            android:textSize="@dimen/_8ssp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <com.google.android.material.textview.MaterialTextView
            android:id="@+id/date_text_view"
            style="@style/TextViewStyle.Bold"
            android:text="16 Aug, Wednesday"
            android:textSize="@dimen/_15ssp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/upcoming_action_text_view" />

        <ImageView
            android:id="@+id/add_action_image_view"
            android:layout_width="@dimen/_30sdp"
            android:layout_height="@dimen/_30sdp"
            android:src="@drawable/ic_plus"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.956"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/upcoming_action_view_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="@dimen/_20sdp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/date_text_view" />

        <com.tbuonomo.viewpagerdotsindicator.WormDotsIndicator
            android:id="@+id/dots_indicator"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:dotsColor="@color/colorAccent"
            app:dotsSize="@dimen/_8sdp"
            app:dotsSpacing="@dimen/_2sdp"
            app:dotsStrokeColor="@color/light_blue"
            app:dotsStrokeWidth="@dimen/_1sdp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/upcoming_action_view_pager" />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/previous_action_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="@dimen/_10sdp"
        android:orientation="vertical"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/top_bar_layout"
        tools:itemCount="5"
        tools:listitem="@layout/item_previous_action_of_confirm_job" />

    <LinearLayout
        android:id="@+id/no_list_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/top_bar_layout">

        <ImageView
            android:id="@+id/not_found_image_view"
            android:layout_width="@dimen/_150sdp"
            android:layout_height="@dimen/_150sdp"
            android:src="@drawable/ic_schedule" />

        <TextView
            android:id="@+id/not_found_text_view"
            style="@style/TextViewStyle.Center.Bold"
            android:layout_marginTop="@dimen/_10sdp"
            android:textColor="@color/colorTextSecondary"
            android:text="No Invoice" />

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>