Show/Hide 使用数据绑定的 ViewModel 中的 ProgessBar - MVVM

Show/Hide ProgessBar from ViewModel using Databinding - MVVM

在从 Web 服务获得响应时,我想 Show/Hide 使用 ViewModel 和数据绑定的进度条。目前,我在直接从我的布局 XML 绑定的 ViewModel 中有一个函数 loginOnClicked。

我想创建一个进度条并在函数 loginOnClicked 中实现它并根据它更新可见性。有人可以帮我吗?

登录活动

class loginActivity : AppCompatActivity(),SignupResultCallBack {

            override fun onSucces(message: String) {
                Toast.makeText(this,message, Toast.LENGTH_SHORT)
                        .show()
            }

            override fun onError(message: String) {
                Toast.makeText(this,message, Toast.LENGTH_SHORT)
                        .show()
            }


            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
               // setContentView(R.layout.activity_login)



     val activityLoginBinding=DataBindingUtil.setContentView<ActivityLoginBinding(this,R.layout.activity_login)
       activityLoginBinding.viewModel=of(this,LoginViewModelFactory(this)).get(LoginViewModel::class.java)



   link_signup.setOnClickListener() {
        var intent=Intent(this@loginActivity,signupActivity::class.java)
                    startActivity(intent)
                    finish()
                }

                var test=activityLoginBinding.viewModel!!.progBar()
                if(test)
                    progressBar?.visibility=View.VISIBLE

                else
                    progressBar?.visibility=View.GONE

            }
        }

ViewModel

    class LoginViewModel(private var listener: SignupResultCallBack): ViewModel() {
        private val loginUser:UserRequest



        init {
            this.loginUser= UserRequest("","")
        }

         fun loginOnCLicked(v:View){
             var editLogin: Int = loginUser.isDataValid()
                         if (editLogin == 0)
                         listener.onError("entrer votre email")
                        else
                         if (editLogin == 1)
                         listener.onError("email invalide")
                        else
                         if (editLogin == 2)
                         listener.onError("mot de passe invalide")
                        else
                         if (editLogin == 3)
                             listener.onError("entrer votre mot de passe")
                         else
                             if (editLogin == 4)
                                 listener.onError("champs vides")
                             else


                             {
                                 RetrofitClient.instance.loginUser(UserRequest(loginUser.getEmail(), loginUser.getPassword())).enqueue(object : Callback<DefaultResponse> {
                                     override fun onFailure(call: Call<DefaultResponse>, t: Throwable) {
                                         listener.onError("t.message")

                                     }

                                     override fun onResponse(call: Call<DefaultResponse>, response: Response<DefaultResponse>) {

                                         if (response.code() == 400)
                                             listener.onSucces("login or password invalid")
                                         else if (response.code() == 200)
                                             listener.onSucces("success login")


                                     }

                                 })

               }

         }



}

login.xml

<?xml version="1.0" encoding="utf-8"?>
    <layout 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">
        <data>
            <variable
                name="viewModel"
                type="com.example.rahma.alerteaccidentapp.vm.login.LoginViewModel"/>

        </data>



        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/colorBackground"
             tools:context=".ui.login.loginActivity">


            <Button
                android:id="@+id/btn_connexion"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="30dp"
                android:background="@drawable/btn_round"
                android:text="Connexion"
                android:onClick="@{viewModel::loginOnCLicked}"

                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp"
                android:layout_below="@id/password_Edit"
                android:textAppearance="@style/MySerifBoldbtn"
                android:textColor="@android:color/background_light"
                />



        </RelativeLayout>


    </layout>  

首先回答您的确切问题,为 Web 服务加载添加进度条。

在您的 LoginViewModel 中创建一个 MutableLiveData 对象

public MutableLiveData<Integer> progress = new MutableLiveData<>();

在您的 loginOnCLicked 方法中

fun loginOnCLicked(v:View){

    progress.setValue(0); //View.VISIBLE

   .

   .

   .

   progress.setValue(8); //View.GONE

}

使用数据绑定向您的布局添加进度条

<ProgressBar
                android:id="@+id/progressBar"
                style="?android:attr/progressBarStyleLarge"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:layout_marginTop="8dp"
                android:visibility="@{viewModel.progress}" />

希望这对您有所帮助。

附带说明一下,我会要求您将 webservice success/Error 案例的侦听器实现更改为 LiveData。这是 MVVM 的处理方式,无需在 ViewModel 中保留 Activity 的引用。