单击按钮时使用不同的数据继续更新相同的 activity

Keep updating the same activity with different data on button click

我有一个 android 应用程序可以询问用户一些问题,类似于调查。每个问题都有一个 YES 和一个 NO Button。因此,当用户按下 YESNO 按钮时,在 YESNO 按钮上可以看到一个新的 Button 以转到下一个问题。当用户单击下一个问题 button 时,它会将问题的 textview 更改为下一个问题文本,并且该问题的 imageView 也会更改。

我正在使用 DataBindingLiveData

我已经创建了一个 list 使用的图像和另一个 list 用于我 ViewModel class.:

中的问题
//list of images : Question 4 does not have an image
imgs= listOf(
        R.drawable.imgQ1, // 1
        R.drawable.imgQ2,// 2
        R.drawable.imgQ3)//3

//list of questions
qs= listOf(
   "What is .....?",//1
   "Who is ....?",//2
   "How to .....?",//3
   "Why is .....?")//4

我创建了一个 ViewState 来处理何时显示哪个按钮和 UI:

sealed class MyUIState{

    data class UIState(
        val policyText: Boolean, // determines if the policy textview should be visible or not
        val nextQuestionButton: Boolean,// determines if the next question button should be visible or not
        val nextQuestionNewImage: Int = R.drawable.imgQ1,//what image is used for the next question
        val nextQuestion: String //what is the next question from the list
    ) : MyUIState()
}

我还有一个 BindingAdapter class 来处理可见性和文本变化以及图像变化 (基本上是这样 - 我已经通过数据绑定将这些功能添加到我的布局文件中):

@BindingAdapter("btnNextQ")
fun Button.btnNextQ(myState: MyUIState?){

    visibility = if (myState is MyUIState.UIState) {
        if (state.nextQuestionButton)
            View.VISIBLE
        else
            View.GONE
    } else
        visibility
}

@BindingAdapter("newImage")
fun ImageView.newImage(myState: MyUIState?){

    if(myStateis MyUIState.UIState){
        setImageResource(state.nextQuestionNewImage)
    }
}

然后在我的 ViewModel class 中,我在 YESNO 按钮上有一个点击事件函数,我调用 UIState 像这样:

//I have this declared at the top of my class (global)
private val myViewState = MutableLiveData<MyUIState>()

//this the button click for yes:
fun YesClick(){

    myViewState.postValue(MyUIState.UIState(
        policyText= true,
        nextQuestionButton = true,
        nextQuestion =  qs[0])) //still keep the text for question1

}

现在,我希望在用户单击 next question 按钮后更改图像和问题。所以基本上发生的事情是,在单击下一个问题后,next question 按钮变得不可见,其他组件保持 YESNO 按钮以及更新的问题和图像。这是我在下一个问题按钮上点击事件的代码:

fun nextQuestion(){

        myViewState .postValue(MyUIState.UIState(
            nextQuestionNewImage = imgs[1],
            nextQuestion = qs[1],
            nextQuestionButton = false,
            policyText= false))
    }

所以状态确实移动到下一个问题,必要的项目是可见的和不可见的,但我正在努力让它进入列表中的下一个问题。我可以从 question1 转到 question2 但不确定如何继续这样做直到问题列表结束。

所以基本上,我只想用新数据继续更新相同的 activity。

我们将不胜感激任何帮助或建议。

不确定我是否理解你真正的问题。也许如果您分享更多代码,我们可以更好地帮助您。

无论如何,我建议您有两种视图状态(在您的情况下为 activity),一种状态用于包含 yesno 按钮的问题本身,问题文本和正确的图像。 “移至下一个”问题的另一种状态,其中包含问题文本、按钮和您想要的任何内容。

然后您的视图需要处理每个状态。在这种情况下,您需要在处理一种状态的同时处理另一种状态,例如显示一个按钮并隐藏不需要的按钮。

因此,无论何时单击 yes 按钮,VM 都会获取事件,检查所有内容,然后将事件发送回具有新状态的视图,依此类推。

这与您所做的完全相同,但是使用两个状态将帮助您处理每个状态并简化您的代码